web-dev-qa-db-ja.com

コマンドラインを使用して、ファイル/ディレクトリパスを選択するGUIダイアログボックスをユーザーに表示するにはどうすればよいですか?

次のようなスクリプトがあるとします。

(この例は、rysncのユースケースを示しています)

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

ここでの考え方は、rsyncを使用するために「ソース」ディレクトリと「宛先」ディレクトリを入力するようにユーザーに促すことです。そのまま、ユーザーはを手動で入力する必要があります/path/to/directory/をコマンドラインから入力します。

代わりに、GUIインターフェイスを介してパスを入力するようユーザーに促したい

このようなもの: screem


コマンドラインにファイルパスを返すGUI選択ウィンドウを使用してユーザーにプロンプ​​トを表示するには、どのコマンドを使用できますか?

14
Pandya

これはファイルに使用できます:

zenity --file-selection

これはフォルダの場合:

zenity --file-selection --directory

使用するには、次を実行します。

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

一般的に、現在のテーマ(とにかくGTKウィンドウマネージャーの場合)に一致しますが、Zukitwo 3.8の改造バージョンを搭載した私のマシンでは、次のようになります。 

これを使用する1つの方法は次のとおりです。

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"

注:また、より多くの機能をロードするZenityのフォークである YAD を使用することもできます。

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
Wilf

記録のためだけに、テキストベースのユーザーインターフェイス(TUI)ソリューションにdialogを使用できます。

構文:

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
kraxor

これは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をforループに入れ、変数$locationを最初のパスでsourceに設定し、2番目のパスでdestinationに設定します。出力は、変数iがインデックスとして使用される配列selection[]に配置されます。これは開始時に0に設定され、パスごとに増分されます。したがって、ソースは${selection[1]}として保存され、宛先は${selection[2]}として保存されます。

最初の行のDIR = "/ home"は、ダイアログのデフォルトを設定します。 yadコマンドのオプションは、yad --helpと入力することにより、ターミナルから見つけることができます。

yad screenshot

5
Scooby-2