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

12

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 é pedir ao usuário para entrar nos diretórios "Source" e "Destination" para o rsync trabalhar. Como é, o usuário terá que inserir manualmente /path/to/directory/ através da linha de comando.

Em vez disso , desejo que o usuário insira os caminhos através de uma interface gráfica .

Algo parecido com isto:

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

    
por Pandya 26.06.2014 / 10:49

4 respostas

30

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 combina com o tema atual, na minha máquina com uma versão modificada do Zukitwo 3.8, é 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 inicia - Com seu caso de uso de 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 tem cargas mais recursos.

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

Fonte

Na maior parte, você pode usá-lo da mesma maneira:

yad --file-selection

para o navegador de arquivos

yad --help-all

para a página de ajuda

Embora a versão que estou usando não tenha sido atualizada para coincidir com a nova interface GTK 3.14+ (zenity has) - esqueça que tem mais recursos:)

    
por Wilf 26.06.2014 / 10:57
17

Apenas para registro, você pode usar dialog para uma solução de interface de 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 assim:

Como apontado por @Wilf, você pode usar as variáveis $LINES e $COLUMNS para preencher o terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
    
por kraxor 26.06.2014 / 11:12
3

Eu sei que isso 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]}\""

A maneira como funciona é assim. Colocamos yad em loop for, configurando a variável $location to source para a primeira passagem e destination para a segunda. A saída é colocada na matriz selection[] para a qual a variável i é usada como o índice. Isso é definido como 0 no início e incrementado com cada passagem. Portanto, a origem é 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 do comando yad podem ser encontradas no terminal digitando yad --help .

    
por Scooby-2 17.03.2015 / 20:27
0

Aqui está a solução mais curta (e melhor) para a resposta: Yad fornece a opção exata como zenity :

yad --file-selection --directory

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

    
por TheUnseen 31.05.2016 / 15:47