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

16

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

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

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

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

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

Что-то вроде этого: Screem


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

Pandya
источник
2
Вы можете использовать Zenity
TuKsn
4
Пожалуйста, не забудьте добавить предупреждение об использовании окон GUI. Ненужные всплывающие окна могут вызвать ярость у опытных пользователей.
unperson325680
5
Почему, о-о, вы бы хотели реализовать такую ​​раздражающую «функцию»? Помните, что если мы вводим каталоги в командной строке, мы можем использовать завершение табуляции, и не нужно ждать загрузки некоторого графического интерфейса. Почему кто-то захочет добавить графический интерфейс в совершенно хороший сценарий оболочки, мне не понятно.
Тердон
1
Поскольку мы смешиваем парадигмы, почему бы не заставить пользователя вводить пути через веб-приложение?
Тулаинс Кордова
4
@terdon Потому что если мы запускаем скрипт напрямую, а не запускаем в терминале, то я хочу предоставить окно графического интерфейса.
Pandya

Ответы:

34

Вы можете использовать это для файлов:

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

Уилф
источник
2
Yad - это значительно улучшенный форк Zenity, который в значительной степени заменил его с тех пор, как проект Zenity стал бездействующим. Я вижу, что Zenity сейчас снова в разработке на Gnome.org (только для Gnome3?), Но я не вижу возможности скачать его.
DocSalvager
@DocSalvage - эта страница довольно древняя - там написано, что следующий выпуск «3.2» - у меня есть версия 3.8 в довольно старой на данный момент системе Fedora 19 (с Gnome 3.8 - довольно много битов gnome обновляются для каждой версии оболочки Gnome ( так что, вероятно, его обновили до 3.10 + 3.12)). Последнее также касается отчетов об ошибках за 2005-2009 гг. Вы можете получить последнюю стабильную версию (снова 3.8) из репозитория Ubuntu - packages.ubuntu.com/trusty/zenity . Вы также можете найти скомпилированные версии Yad здесь .
Уилф
Яд выглядит неплохо - у него больше возможностей, чем в зените :)
Уилф
1
@Wilf Да, Яд - это Зениты на стероидах. Как только вы справляетесь с этим, он становится невероятно гибким. Я новообращенный. Я дал (не мог сопротивляться этому, извините) ответ на вопрос OPs ниже, между прочим.
Скуби-2
@ Scooby-2 круто добавил инструкции по установке, чтобы ответить (чтобы будущие пользователи не должны были делать комментарии)
Уилф
19

Просто для записи, вы можете использовать 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."

Вывод будет примерно таким:

пример

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

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
источник
1
Хотя это правильное альтернативное решение, но оно не предоставляет окно GUI, как упоминалось в вопросе!
Pandya
2
Я знаю, но кто-то еще может найти это полезным. Я разместил скриншот, чтобы избежать путаницы.
kraxor
7
И, если честно, это квалифицируется как GUI IMHO.
kraxor
3
Обычно используемая линия между GUI и TUI (текстовый интерфейс) имеет размер «атома»: это пиксель или символ?
unperson325680
3
Хороший ответ - ширина и высота некоторых терминалов определяется переменными, такими как $LINESи $COLUMNS- поэтому вы запускаете, $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))чтобы заполнить окно терминала / экрана.
Уилф
5

Я знаю, что это 8 месяцев, а также на вопрос ОП был дан ответ. Тем не менее, Яд был упомянут, но ни один пример не был предложен. Вот мое решение с использованием Яд.

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]}\""

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

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

скриншот Яда

Скуби-2
источник
2

Вот самое короткое (и лучшее) решение для ответа: Yadпредоставляет точную опцию, как это zenityделает:

yad --file-selection --directory

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

TheUnseen
источник