如何使用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选择窗口提示用户返回命令行的文件路径?

您可以将其用于文件:

 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的分支,具有更多function。

 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有) – 它有更多的function,但检查兼容性(基于文档它应该适用于GTK +> = 2.16。 0

只是为了记录,您可以使用基于文本的用户界面(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." 

输出将是这样的:

例

正如@Wilf所指出的,您可以使用$LINES$COLUMNS变量来填充终端:

 $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10)) 

我知道这已经有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和第二个传递的destination 。 输出放在数组selection[]中,变量i用作索引。 它在开始时设置为0,并在每次传递时递增。 因此,源保存为${selection[1]}和目的地${selection[2]}

第一行的DIR =“/ home”设置对话框默认值。 可以通过键入yad --help从终端找到yad命令选项。

你的截图

这是答案的最短(也是最好)解决方案: Yad提供了与zenity一样的确切选项:

 yad --file-selection --directory 

这将打开目录选择对话框。 如果没有附加参数--directory ,它将成为文件选择对话框。