web-dev-qa-db-fra.com

Comment puis-je inviter les utilisateurs d'une boîte de dialogue d'interface graphique à choisir le chemin d'accès au fichier / répertoire via la ligne de commande?

Supposons que j'ai un script comme celui-ci:

(L'exemple décrit un cas d'utilisation de rysnc)

#!/bin/bash
echo -n "Enter Source Directory:"
read srcdir
echo -n "Enter Destination Directory:"
read dstdir
rsync -av --delete "$srcdir" "$dstdir"

L'idée ici est d'inviter l'utilisateur à entrer dans les répertoires "Source" et "Destination" avec lesquels rsync peut travailler. Tel quel, l'utilisateur devra entrer manuellement /path/to/directory/ via la ligne de commande.

À la place , je souhaite demander à l'utilisateur de saisir les chemins d'accès via une interface graphique .

Quelque chose comme ça: screem


Quelles commandes puis-je utiliser pour demander à l'utilisateur une fenêtre de sélection d'interface graphique renvoyant le chemin du fichier à la ligne de commande?

14
Pandya

Vous pouvez l'utiliser pour les fichiers:

zenity --file-selection

et ceci pour les dossiers:

zenity --file-selection --directory

pour utilisation, lancez:

zenity --help-general
zenity --help-file-selection

Généralement, il correspond au thème actuel (pour les gestionnaires de fenêtres GTK de toute façon), sur ma machine avec une version modifiée de Zukitwo 3.8, il ressemble à ceci: 

Une façon de l'utiliser est la suivante:

echo "you selected $(zenity --file-selection)"

Ce qui donnerait you selected /path/to/file.

Vous pouvez également utiliser les options pour définir un titre approprié et le répertoire dans lequel il commence - Avec votre cas d'utilisation rsync, par exemple:

zenity --file-selection --directory --title="Choose rsync source directory" --filename=$HOME/Desktop/

Pour les fichiers, vous pouvez également spécifier un type de fichier pour sélectionner - par exemple:

zenity --file-selection --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file"

REMARQUE: Vous pouvez également utiliser YAD , un fork de Zenity qui contient plus de fonctionnalités.

Sudo add-apt-repository ppa:webupd8team/y-ppa-manager
Sudo apt-get update
Sudo apt-get install yad

Source

Pour l'essentiel, vous pouvez l'utiliser de la même manière - pour le navigateur de fichiers:

yad --file-selection

et pour la page d'aide:

yad --help-all

Bien qu'à l'époque (autour de la version 26?), Il n'avait pas été mis à jour pour correspondre à la nouvelle interface GTK 3.14+ (zenity had) - il a plus de fonctionnalités, mais vérifiez la compatibilité (basé sur la documentation, il devrait fonctionner sur GTK +> = 2.16. 0

33
Wilf

À titre d'information, vous pouvez utiliser dialog pour une solution d'interface utilisateur à base de texte.

Syntaxe:

dialog --title "text" --fselect /path/to/dir height width

Exemple:

FILE=$(dialog --stdout --title "Please choose a file" --fselect $HOME/ 14 48)
echo "${FILE} file chosen."

La sortie sera quelque chose comme ça:

Example

Comme l'a souligné @Wilf, vous pouvez utiliser les variables $LINES et $COLUMNS pour remplir le terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
18
kraxor

Je sais que cela fait 8 mois et que la question du PO a été résolue. Cependant, yad a été mentionné mais aucun exemple n’a été proposé. Voici ma solution en utilisant yad.

DIR="/home" \
i=0;for location in source destination
do
((i++));selection[$i]=$(yad --center \
--width 350 \
--form \
--title="yad example" \
--text="Select $location directory" \
--field=:LBL "" \
--field=Path:DIR "$DIR" \
--separator='' )
done;\
echo "Command to run is \"rsync -av --delete ${selection[1]} ${selection[2]}\""

La façon dont cela fonctionne est comme ça. Nous avons mis yad dans une boucle for, en définissant la variable $location à source pour la première passe et destination pour la seconde. La sortie est placée dans le tableau selection[] pour lequel la variable i est utilisée comme index. Cette valeur est définie sur 0 au début et incrémentée à chaque passage. Par conséquent, la source est enregistrée sous le nom ${selection[1]} et la destination ${selection[2]}.

Le répertoire DIR = "/ home" sur la première ligne définit la boîte de dialogue par défaut. Les options de commande yad peuvent être trouvées à partir du terminal en tapant yad --help.

yad screenshot

5
Scooby-2

Voici la solution la plus courte (et la meilleure) à la réponse: Yad fournit l'option exacte exactement comme zenity le fait:

yad --file-selection --directory

Cela ouvre une boîte de dialogue de sélection de répertoire. Sans l'argument supplémentaire --directory, il s'agira plutôt d'une boîte de dialogue de sélection de fichier.

2
TheUnseen