Comment inviter les utilisateurs avec une boîte de dialogue GUI à choisir le chemin du fichier / répertoire, via la ligne de commande?

16

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

(L'exemple illustre un cas d'utilisation 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" pour que rsync puisse travailler. En l'état, l'utilisateur devra entrer manuellement /path/to/directory/ via la ligne de commande.

Au lieu de cela , je veux inviter l'utilisateur à entrer les chemins via une interface graphique .

Quelque chose comme ça: cri


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

Pandya
la source
2
Vous pouvez utiliser Zenity: help.gnome.org/users/zenity/stable/file-selection.html.en
TuKsn
4
N'oubliez pas d'ajouter un avertissement sur l'utilisation des fenêtres GUI. Des fenêtres inutiles qui surgissent peuvent provoquer la rage des utilisateurs avancés.
unperson325680
5
Pourquoi, oh pourquoi voudriez-vous jamais implémenter une telle "fonctionnalité" ennuyeuse? N'oubliez pas que si nous entrons dans les répertoires sur la ligne de commande, nous pouvons utiliser la complétion de tabulation, et n'avons pas besoin d'attendre le chargement d'une interface graphique. Pourquoi quelqu'un voudrait ajouter une interface graphique à un script shell parfaitement bon me dépasse.
terdon
1
Puisque nous mélangeons des paradigmes, pourquoi ne pas demander à l'utilisateur de saisir les chemins via une application Web?
Tulains Córdova
4
@terdon Parce que si nous exécutons le script directement et non pas dans le terminal, je veux fournir une fenêtre GUI.
Pandya

Réponses:

34

Vous pouvez l'utiliser pour les fichiers:

zenity --file-selection

et cela pour les dossiers:

zenity --file-selection --directory

pour l'utilisation, exécutez:

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

En général, 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 entraînerait you selected /path/to/file.

Vous pouvez également utiliser des options pour définir un titre approprié et le répertoire dans lequel il démarre - 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 à 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 a beaucoup plus de fonctionnalités.

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

La source

Pour la plupart, 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 avait) - il a plus de fonctionnalités, mais vérifiez la compatibilité (sur la base de la documentation, il devrait fonctionner sur GTK +> = 2.16. 0

Wilf
la source
2
Yad est un fork de Zenity considérablement amélioré et l'a largement remplacé depuis que le projet Zenity est devenu dormant. Je vois que Zenity est maintenant de retour en développement sur Gnome.org (Gnome3 uniquement?) Mais je ne vois aucun moyen de le télécharger.
DocSalvager
@DocSalvage - cette page est assez ancienne - elle indique la prochaine version '3.2' - J'ai la version 3.8 sur un système Fedora 19 désormais assez ancien (avec Gnome 3.8 - pas mal de bits de gnome sont mis à jour pour chaque version du shell Gnome ( donc c'est probablement mis à jour pour 3.10 + 3.12)). Il traite également des rapports de bogues de 2005-2009. Vous pouvez obtenir la dernière version stable (3.8 à nouveau) à partir des dépôts Ubuntu - packages.ubuntu.com/trusty/zenity . Vous devriez également pouvoir trouver des versions compilées de Yad ici .
Wilf
Yad a l'air plutôt bien - il a plus d'options que la zénité :)
Wilf
1
@Wilf Oui, yad est Zenity sur les stéroïdes. Une fois que vous l'avez compris, il bascule car il est si flexible. Je suis converti. J'ai ajouté (je n'ai pas pu résister à cela, désolé) une réponse à la question OP ci-dessous, btw.
Scooby-2
@ Scooby-2 cool ajouté des instructions d'installation pour répondre (afin que les futurs utilisateurs n'aient pas à faire de commentaires)
Wilf
19

Juste pour mémoire, vous pouvez utiliser dialogpour une solution d'interface utilisateur basée sur du texte (TUI).

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 ceci:

Exemple

Comme l'a souligné @Wilf, vous pouvez utiliser les variables $LINESet $COLUMNSpour le faire remplir le terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
la source
1
Bien que ce soit une bonne solution alternative, mais elle ne fournit pas de fenêtre GUI comme mentionné en question!
Pandya
2
Je sais, mais quelqu'un d'autre pourrait trouver cela utile. J'ai posté la capture d'écran pour éviter toute confusion.
kraxor
7
Et, pour être juste, il se qualifie en tant que GUI IMHO.
kraxor
3
La ligne couramment utilisée entre les GUI et les TUI (UI textuelle) est la taille de "l'atome": est-ce un pixel ou un caractère?
unperson325680
3
Bonne réponse - la largeur et la hauteur de certains terminaux sont définies par des variables telles que $LINESet $COLUMNS- alors vous exécutez $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))pour le faire remplir la fenêtre terminal / écran.
Wilf
5

Je sais que cela a 8 mois et aussi que la question du PO a été répondue. 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 $locationsur sourcepour la première passe et destinationpour la seconde. La sortie est placée dans le tableau selection[]pour lequel la variable iest utilisée comme index. Il est défini sur 0 au début et incrémenté à chaque passage. Par conséquent, la source est enregistrée en tant ${selection[1]}que destination ${selection[2]}.

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

capture d'écran yad

Scooby-2
la source
2

Voici la solution la plus courte (et la meilleure) à la réponse: Yadfournit l'option exacte tout comme zenity:

yad --file-selection --directory

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

L'invisible
la source