¿Cómo solicito a los usuarios con un cuadro de diálogo GUI que elijan la ruta del archivo / directorio, a través de la línea de comandos?

16

Supongamos que tengo un script como este:

(El ejemplo muestra un caso de uso de rysnc)

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

La idea aquí es pedirle al usuario que ingrese los directorios "Origen" y "Destino" para que rsync trabaje. Tal como está, el usuario tendrá que ingresar manualmente a /path/to/directory/ través de la línea de comandos.

En cambio , quiero pedirle al usuario que ingrese las rutas a través de una interfaz GUI .

Algo como esto: screem


¿Qué comandos puedo usar para solicitar al usuario una ventana de selección de GUI que devuelva la ruta del archivo a la línea de comandos?

Pandya
fuente
44
Recuerde agregar una advertencia sobre el uso de ventanas GUI. Las ventanas emergentes innecesarias pueden provocar ira en los usuarios avanzados.
unperson325680
55
¿Por qué, por qué querrías implementar una "característica" tan molesta? Recuerde que si ingresamos los directorios en la línea de comando, podemos usar la finalización de tabulación y no necesitamos esperar a que se cargue alguna interfaz gráfica de usuario. ¿Por qué alguien querría agregar una GUI a un script de shell perfectamente bueno?
terdon
1
Dado que estamos mezclando paradigmas, ¿por qué no hacer que el usuario ingrese las rutas a través de una aplicación web?
Tulains Córdova
44
@terdon Porque si ejecutamos el script directamente y no Ejecutamos en la terminal, entonces quiero proporcionar una ventana GUI.
Pandya

Respuestas:

34

Puede usar esto para archivos:

zenity --file-selection

y esto para carpetas:

zenity --file-selection --directory

para uso, ejecute:

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

Generalmente coincide con el tema actual (para los gestores de ventanas GTK de todos modos), en mi máquina con una versión modificada de Zukitwo 3.8 se ve así:

Una forma de usarlo es así:

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

Lo que resultaría en you selected /path/to/file .

También puede usar las opciones para establecer un título apropiado y el directorio en el que comienza: con su caso de uso de rsync, por ejemplo:

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

Para los archivos, también puede especificar un tipo de archivo para seleccionar, por ejemplo:

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

NOTA: También puede usar YAD , una bifurcación de Zenity que tiene muchas más funciones.

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

Fuente

En su mayor parte, puede usarlo de la misma manera: para el explorador de archivos:

yad --file-selection

y para la página de ayuda:

yad --help-all

Aunque en ese momento (¿alrededor de la versión 26?), No se había actualizado para que coincida con la nueva interfaz GTK 3.14+ (zenity tenía): tiene más funciones, pero verifica la compatibilidad (según la documentación, debería funcionar en GTK +> = 2.16. 0 0

Wilf
fuente
2
Yad es una bifurcación de Zenity dramáticamente mejorada y la ha reemplazado en gran medida desde que el proyecto Zenity quedó inactivo. Veo que Zenity ahora está de vuelta en desarrollo en Gnome.org (¿solo Gnome3?) Pero no veo forma de descargarlo.
DocSalvager
@DocSalvage - esa página es bastante antigua - dice la próxima versión '3.2' - Tengo la versión 3.8 en un sistema Fedora 19 ahora bastante antiguo (con Gnome 3.8 - se actualizan bastantes bits de gnome para cada versión de Gnome shell ( probablemente se haya actualizado para 3.10 + 3.12)). También se ocupa de los informes de errores de 2005-2009. Puede obtener la última versión estable (3.8 nuevamente) de los repositorios de Ubuntu: packages.ubuntu.com/trusty/zenity . También debería poder encontrar versiones compiladas de Yad aquí .
Wilf
Yad se ve bastante bien - tiene más opciones que zenity :)
Wilf
1
@Wilf Sí, yad es Zenity con esteroides. Una vez que lo manejas, se balancea porque es muy flexible. Soy un converso Le respondí (no pude resistir eso, lo siento) una respuesta a la pregunta de OP a continuación, por cierto.
Scooby-2
@ Scooby-2 cool agregó instrucciones de instalación para responder (para que los futuros usuarios no tengan que hacer comentarios)
Wilf
19

Solo para el registro, puede usarlo dialogpara una solución de interfaz de usuario basada en texto (TUI).

Sintaxis:

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

Ejemplo:

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

La salida será algo como esto:

Ejemplo

Como señaló @Wilf, puede usar las variables $LINESy $COLUMNSpara que llene el terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
fuente
1
¡Aunque es la solución alternativa correcta pero no proporciona una ventana GUI como se menciona en la pregunta!
Pandya
2
Lo sé, pero alguien más podría encontrarlo útil. Publiqué la captura de pantalla para evitar confusiones.
kraxor
77
Y, para ser justos, califica como una GUI en mi humilde opinión.
kraxor
3
La línea de uso común entre GUI y TUI (interfaz de usuario textual) es el tamaño del "átomo": ¿es un píxel o un carácter?
unperson325680
3
Buena respuesta: el ancho y la altura de algunos terminales se definen mediante variables como $LINESy $COLUMNS, por lo que debe ejecutar $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))para llenar la ventana de terminal / pantalla.
Wilf
5

Sé que esto tiene 8 meses y también que la pregunta del OP ha sido respondida. Sin embargo, se ha mencionado yad pero no se ha ofrecido ningún ejemplo. Aquí está mi solución usando 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 forma en que funciona es así. Ponemos yad en un bucle for, configurando la variable $locationen sourcepara el primer pase y destinationpara el segundo. La salida se coloca en la matriz selection[]para la que ise utiliza la variable como índice. Esto se establece en 0 al comienzo y se incrementa con cada pase. Por lo tanto, la fuente se guarda como ${selection[1]}y el destino ${selection[2]}.

DIR = "/ home" en la primera línea establece el diálogo predeterminado. Las opciones de comando yad se pueden encontrar desde la terminal escribiendo yad --help.

captura de pantalla de yad

Scooby-2
fuente
2

Aquí está la solución más corta (y mejor) para la respuesta: Yadproporciona la opción exacta al igual que lo zenityhace:

yad --file-selection --directory

Esto abre un diálogo de selección de directorio. Sin el argumento adicional --directory, será un cuadro de diálogo de selección de archivos.

Lo nunca visto
fuente