Wie fordere ich Benutzer mit einem GUI-Dialogfeld auf, den Datei- / Verzeichnispfad über die Befehlszeile auszuwählen?

15

Angenommen, ich habe ein Skript wie das folgende:

(Das Beispiel zeigt einen rysnc-Anwendungsfall.)

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

Die Idee hier ist, den Benutzer aufzufordern, die "Quell" - und "Ziel" -Verzeichnisse einzugeben, damit rsync damit arbeiten kann. Wie es ist, muss der Benutzer manuell /path/to/directory/ über die Befehlszeile eingeben .

Stattdessen möchte ich den Benutzer auffordern, die Pfade über eine GUI-Schnittstelle einzugeben .

Etwas wie das: schreien


Welche Befehle kann ich verwenden, um den Benutzer mit einem GUI-Auswahlfenster aufzufordern , das den Dateipfad zur Befehlszeile zurückgibt?

Pandya
quelle
2
Sie können Zenity verwenden: help.gnome.org/users/zenity/stable/file-selection.html.de
TuKsn
4
Bitte denken Sie daran, eine Warnung zur Verwendung von GUI-Fenstern hinzuzufügen. Unnötiges Auftauchen von Fenstern kann bei fortgeschrittenen Benutzern Wut auslösen.
unperson325680
5
Warum, oh, warum sollten Sie jemals solch ein nerviges "Feature" implementieren wollen? Denken Sie daran, dass wir, wenn wir die Verzeichnisse in der Befehlszeile eingeben, die Tabulatorvervollständigung verwenden können und nicht warten müssen, bis eine GUI geladen ist. Warum jemand eine GUI zu einem perfekten Shell-Skript hinzufügen möchte, ist mir ein Rätsel.
Terdon
1
Warum lässt sich der Benutzer die Pfade nicht über eine Web-App eingeben, da wir Paradigmen mischen?
Tulains Córdova
4
@terdon Denn wenn wir das Skript direkt ausführen und nicht im Terminal ausführen, möchte ich ein GUI-Fenster bereitstellen.
Pandya

Antworten:

33

Sie können dies für Dateien verwenden:

zenity --file-selection

und das für ordner:

zenity --file-selection --directory

Führen Sie zur Verwendung Folgendes aus:

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

Im Allgemeinen entspricht es dem aktuellen Thema (für GTK-Fenstermanager sowieso), auf meinem Computer mit einer modifizierten Version von Zukitwo 3.8 sieht es so aus:

Eine Möglichkeit, es zu benutzen, ist wie folgt:

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

Was dazu führen würde you selected /path/to/file.

Sie können auch Optionen verwenden, um einen geeigneten Titel und das Verzeichnis festzulegen, in dem er beginnt. Beispiel für Ihren rsync-Anwendungsfall:

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

Für Dateien können Sie auch einen Dateityp angeben, der ausgewählt werden soll, z. B .:

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

HINWEIS: Sie können auch YAD verwenden , einen Zweig von Zenity, der mehr Funktionen bietet.

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

Quelle

Zum größten Teil können Sie es auf die gleiche Weise verwenden - für den Dateibrowser:

yad --file-selection

und für die Hilfeseite:

yad --help-all

Obwohl es zu der Zeit (um die Version 26?) Nicht aktualisiert wurde, um mit der neuen GTK 3.14+ -Oberfläche übereinzustimmen (zenity hatte) - es hat mehr Funktionen, aber prüfe die Kompatibilität (basierend auf der Dokumentation sollte es mit GTK +> = 2.16 funktionieren). 0

Wilf
quelle
2
Yad ist eine dramatisch verbesserte Version von Zenity und hat sie seit dem Stillstand des Zenity-Projekts weitgehend ersetzt. Ich sehe, dass Zenity jetzt wieder auf Gnome.org entwickelt wird (nur Gnome3?), Aber ich sehe keine Möglichkeit, es herunterzuladen.
DocSalvager
@DocSalvage - diese Seite ist ziemlich alt - es steht die nächste Version '3.2' - Ich habe Version 3.8 auf einem mittlerweile ziemlich alten Fedora 19-System (mit Gnome 3.8 werden für jede Version der Gnome-Shell einige Teile von Gnome aktualisiert ( Daher wurde es wahrscheinlich für 3.10 + 3.12)) aktualisiert. Es befasst sich zuletzt auch mit Fehlerberichten von 2005-2009. Sie können die neueste stabile Version (wieder 3.8) von Ubuntu repos - packages.ubuntu.com/trusty/zenity herunterladen . Sie sollten auch in der Lage sein, kompilierte Versionen von Yad hier zu finden .
Wilf
Yad sieht ganz gut aus - es hat mehr Möglichkeiten als Zenity :)
Wilf
1
@Wilf Ja, du bist Zenity auf Steroiden. Sobald Sie es in den Griff bekommen, rockt es, da es so flexibel ist. Ich bin ein Konvertit. Ich habe eine Antwort auf die Frage des OPs unten geschrieben (kann dem nicht widerstehen, sorry), übrigens.
Scooby-2,
@ Scooby-2 cool hinzugefügt Installationsanweisungen zu beantworten (damit zukünftige Benutzer keine Kommentare zu tun haben)
Wilf
19

Nur für den Datensatz können Sie dialogfür eine textbasierte Benutzeroberflächenlösung (TUI) verwenden.

Syntax:

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

Beispiel:

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

Die Ausgabe wird ungefähr so ​​aussehen:

Beispiel

Wie durch @Wilf wies darauf hin, können Sie die Verwendung $LINESund $COLUMNSVariablen zu dem Terminal machen füllen:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
quelle
1
Es ist zwar die richtige alternative Lösung, bietet aber kein GUI-Fenster, wie in der Frage erwähnt!
Pandya
2
Ich weiß, aber jemand anderes könnte es nützlich finden. Ich habe den Screenshot gepostet, um Verwirrung zu vermeiden.
Kraxor
7
Und um fair zu sein, qualifiziert es sich als GUI IMHO.
Kraxor
3
Die häufig verwendete Linie zwischen GUIs und TUIs (textual UI) ist die Größe des "Atoms": Ist es ein Pixel oder ein Zeichen?
unperson325680
3
Gute Antwort - Die Breite und Höhe einiger Terminals wird durch Variablen wie $LINESund definiert. $COLUMNSSie müssen also ausführen $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10)), um das Terminal- / Bildschirmfenster auszufüllen.
Wilf
5

Ich weiß, dass dies 8 Monate alt ist und dass die Frage des OP beantwortet wurde. Es wurde jedoch darauf hingewiesen, aber es wurde kein Beispiel angeführt. Hier ist meine Lösung mit 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]}\""

So funktioniert es. Wir setzen yad in einer for - Schleife, Setzen der Variable $locationauf sourcefür den ersten Durchlauf und destinationfür den zweiten. Die Ausgabe wird in das Array gestellt, selection[]für das die Variable ials Index verwendet wird. Diese wird zu Beginn auf 0 gesetzt und mit jedem Durchgang erhöht. Daher wird die Quelle als ${selection[1]}und das Ziel gespeichert ${selection[2]}.

Das DIR = "/ home" in der ersten Zeile legt die Standardeinstellung für den Dialog fest. Die yad-Befehlsoptionen finden Sie im Terminal, indem Sie Folgendes eingebenyad --help .

Ihr Screenshot

Scooby-2
quelle
2

Hier ist die kürzeste (und beste) Lösung für die Antwort: Yadgenau die Option wiezenity folgt:

yad --file-selection --directory

Dies öffnet einen Verzeichnisauswahldialog. Ohne das zusätzliche Argument --directorywird stattdessen ein Dateiauswahldialog angezeigt.

Das ungesehene
quelle