Como solicito aos usuários com uma caixa de diálogo GUI para escolher o caminho do arquivo / diretório, através da linha de comando?

15

Suponha que eu tenha um script como este:

(O exemplo descreve um caso de uso rysnc)

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

A idéia aqui é solicitar ao usuário que digite os diretórios "Origem" e "Destino" para o rsync trabalhar. Como é, o usuário terá que entrar manualmente /path/to/directory/ via linha de comando.

Em vez disso , quero solicitar ao usuário que insira os caminhos por meio de uma interface GUI .

Algo assim: screem


Quais comandos posso usar para solicitar ao usuário uma janela de seleção da GUI que retorne o caminho do arquivo para a linha de comando?

Pandya
fonte
4
Lembre-se de adicionar um aviso sobre o uso das janelas da GUI. Aparecer janelas desnecessárias pode causar raiva em usuários avançados.
precisa
5
Por que, oh, por que você desejaria implementar um "recurso" tão irritante? Lembre-se de que, se inserirmos os diretórios na linha de comando, poderemos usar o preenchimento de guias e não precisaremos esperar que alguma GUI seja carregada. Por que alguém iria querer adicionar uma GUI a um script shell perfeitamente bom está além de mim.
terdon
1
Como estamos misturando paradigmas, por que não fazer com que o usuário insira os caminhos por meio de um aplicativo da web?
Tulains Córdova
4
@terdon Porque se executarmos o script diretamente e não executar no terminal , quero fornecer uma janela da GUI.
Pandya

Respostas:

33

Você pode usar isso para arquivos:

zenity --file-selection

e isso para pastas:

zenity --file-selection --directory

para uso, execute:

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

Geralmente ele corresponde ao tema atual (para os gerenciadores de janelas GTK de qualquer maneira); na minha máquina, com uma versão modificada do Zukitwo 3.8, fica assim:

Uma maneira de usá-lo é assim:

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

O que resultaria em you selected /path/to/file.

Você também pode usar opções para definir um título apropriado e o diretório em que ele começa - Com o seu caso de uso do rsync, por exemplo:

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

Para arquivos, você também pode especificar um tipo de arquivo para selecionar - por exemplo:

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

NOTA: Você também pode usar o YAD , um fork do Zenity que possui mais recursos.

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

Fonte

Na maioria das vezes, você pode usá-lo da mesma maneira - no navegador de arquivos:

yad --file-selection

e para a página de ajuda:

yad --help-all

Embora na época (em torno da versão 26?), Ele não tivesse sido atualizado para corresponder à nova interface GTK 3.14+ (havia zenity) - ele tem mais recursos, mas verifique a compatibilidade (com base na documentação, ele deve funcionar no GTK +> = 2.16. 0 0

Wilf
fonte
2
O Yad é um fork do Zenity dramaticamente aprimorado e o substituiu amplamente desde que o projeto Zenity ficou inativo. Vejo que o Zenity agora está de volta ao desenvolvimento no Gnome.org (somente Gnome3?), Mas não vejo como baixá-lo.
DocSalvager
@DocSalvage - essa página é bastante antiga - diz a próxima versão '3.2' - Eu tenho a versão 3.8 em um sistema Fedora 19 agora bastante antigo (com o Gnome 3.8 - alguns bits do gnome são atualizados para cada versão do shell do Gnome ( então provavelmente foi atualizado para 3.10 + 3.12)). Por último, trata também de relatórios de erros de 2005-2009. Você pode obter a versão estável mais recente (3.8 novamente) nos repositórios do Ubuntu - packages.ubuntu.com/trusty/zenity . Você também deve encontrar versões compiladas do Yad aqui .
Wilf
Yad parece muito bom - ele tem mais opções do que zenity :)
Wilf
1
@ Wilf Sim, o yad é Zenity em esteróides. Uma vez que você se familiariza com isso, ele oscila por ser tão flexível. Eu sou um convertido. Eu consegui (não resisti a isso, desculpe) uma resposta à pergunta dos OPs abaixo, btw.
Scooby-2
@ Scooby-2 fresco adicionado instalar instruções para resposta (para os futuros usuários não têm de fazer comentários)
Wilf
19

Apenas para o registro, você pode usar dialog uma solução de interface do usuário baseada em texto (TUI).

Sintaxe:

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

Exemplo:

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

A saída será algo como isto:

Exemplo

Como apontado por @Wilf, você pode usar as variáveis $LINESe $COLUMNSpara fazê-lo preencher o terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
fonte
1
Embora seja a solução alternativa correta, mas não fornece janela da GUI, como mencionado em questão!
Pandya
2
Eu sei, mas alguém pode achar útil. Postei a captura de tela para evitar qualquer confusão.
kraxor
7
E, para ser justo, qualifica-se como uma GUI IMHO.
kraxor
3
A linha comumente usada entre GUIs e TUIs (interface de usuário textual) é o tamanho do "átomo": é um pixel ou um caractere?
precisa
3
Boa resposta - a largura e a altura de alguns terminais são definidas por variáveis ​​como $LINESe $COLUMNS- então você corre $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))para fazê-lo preencher a janela do terminal / tela.
Wilf
5

Sei que tem 8 meses e também que a pergunta do OP foi respondida. No entanto, o yad foi mencionado, mas nenhum exemplo foi oferecido. Aqui está a minha solução 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]}\""

O modo como funciona é assim. Colocamos Yad em um loop, definindo a variável $locationpara sourcea primeira passagem e destinationpara o segundo. A saída é colocada na matriz selection[]para a qual a variável ié usada como índice. Isso é definido como 0 no início e incrementado a cada passagem. Portanto, a fonte é salva como ${selection[1]}e o destino ${selection[2]}.

O DIR = "/ home" na primeira linha define o padrão da caixa de diálogo. As opções de comando yad podem ser encontradas no terminal digitando yad --help.

yad screenshot

Scooby-2
fonte
2

Aqui está a solução mais curta (e melhor) para a resposta: Yadfornece a opção exata da mesma forma zenityque:

yad --file-selection --directory

Isso abre uma caixa de diálogo de seleção de diretório. Sem o argumento adicional --directory, será uma caixa de diálogo de seleção de arquivo.

O invisível
fonte