Как мне предложить пользователям с помощью диалогового окна с графическим интерфейсом пользователя выбрать путь к файлу / каталогу через командную строку?

Предположим, у меня есть такой сценарий:

(в примере показан сценарий использования rysnc)

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

Идея в том, чтобы предложить пользователю ввести «Источник» и Каталоги "Destination" для работы с rsync. Таким образом, пользователь должен будет вручную ввести /path/to/directory/ через командную строку.

Вместо я хочу предложить пользователю ввести пути через интерфейс GUI .

Примерно так: screem


Какие команды можно использовать, чтобы запросить у пользователя окно выбора GUI , которое возвращает путь к файлу в командной строке?

15
задан 6 December 2016 в 17:28

4 ответа

Можно использовать это для файлов:

zenity --file-selection

и это для папок:

zenity --file-selection --directory

для использования, выполненного:

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

Обычно это соответствует текущей теме (для менеджеров окон GTK так или иначе) на моей машине с кивнувшей версией Zukitwo 3.8, это похоже на это:

Один способ использовать его похож на это:

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

, Который привел бы к you selected /path/to/file.

можно также использовать опции установить соответствующий заголовок и каталог, который он запускает в - С rsync варианта использования, например:

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

Для файлов, можно также определить тип файла для выбора - например:

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

ПРИМЕЧАНИЕ: можно также использовать YAD, ветвление Zenity, который имеет загрузки больше функций.

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

<глоток> Источник

По большей части можно использовать его тот же путь - для файлового браузера:

yad --file-selection

и для страницы справки:

yad --help-all

, Хотя в то время (вокруг версии 26?), это не было обновлено для соответствия новому интерфейсу GTK 3.14 + (zenity, имел) - это имеет больше функций, но совместимость проверки (на основе документации, это должно работать над GTK +> = 2.16.0

33
ответ дан 6 December 2016 в 17:28

Только для справки можно использовать dialog для решения для Основанного на тексте пользовательского интерфейса (TUI).

Синтаксис:

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

Пример:

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

вывод будет чем-то вроде этого:

Example

, Как указано @Wilf, можно использовать $LINES и $COLUMNS переменные, чтобы заставить его заполнить терминал:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
18
ответ дан 6 December 2016 в 17:28

Я знаю, что этому 8 месяцев и также что на вопрос OP ответили. Однако yad был упомянут, но никакой пример не был предложен. Вот мое решение с помощью 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]}\""

Путем это работает, похож на это. Мы вставляем yad для цикла, устанавливая переменную $location кому: source для первичной обработки и destination для второго. Вывод помещается в массив selection[] для которого переменная i используется в качестве индекса. Это установлено на 0 в запуске и увеличено с каждой передачей. Следовательно источник сохраняется как ${selection[1]} и место назначения ${selection[2]}.

DIR = "/home" на первой строке устанавливает диалоговое значение по умолчанию. Опции команды yad могут быть найдены от терминала путем ввода yad --help.

yad screenshot

5
ответ дан 6 December 2016 в 17:28

Здесь является самым коротким (и лучше всего) решение ответа: Yad предоставляет точную возможность точно так же, как zenity делает:

yad --file-selection --directory

Это открывает диалоговое окно выбора каталога. Без дополнительного аргумента --directory это будет диалоговое окно выбора файла вместо этого.

2
ответ дан 6 December 2016 в 17:28

Другие вопросы по тегам:

Похожие вопросы: