用bash脚本打开最新下载的文件

以下是我在这个问题上的尝试。 这是一个function脚本,但是我必须指定要用于每个文件types的应用程序。 由于有关默认应用程序的信息必须存储在Linux / Ubuntu的某个地方,我如何访问它们并将其并入我的脚本?

另外,我的脚本可以以任何方式更“优雅”吗?

感谢您帮助Bash脚本初学者! 我很感激任何评论。

#!/bin/bash # Open the latest file in ~/Downloads filename=$(ls -t ~/Downloads | head -1) filetype=$(echo -n $filename | tail -c -3) if [ $filetype == "txt" ]; then leafpad ~/Downloads/$filename elif [ $filetype == "pdf" ]; then evince ~/Downloads/$filename fi 

欢迎来到bash编程。 🙂

首先,我会告诉你的Bash常见问题 。 伟大的资源,许多提示,观点和警告。

其中之一是你的脚本经受的经典的解析LS问题。 其基本思想是不要信任ls命令的输出,因为特殊字符(如空格和控制字符)可能以不允许引用该文件的方式表示。

你打开“最后”的文件,由ls命令正在做的排序决定。 为了检测没有 ls最新文件,我们需要一些额外的代码。 例如:

 #!/bin/sh last=0 for filename in ~/Downloads/*; do when=$(stat -c '%Y' "$filename") if [ $when -gt $last ]; then last=$when to_open="$filename" fi done xdg-open "$to_open" 

我们的想法是,我们将浏览Downloads目录中的每个文件,并使用stat命令对最大时间戳的文件进行处理。 然后使用xdg-open打开该文件,该文件可能已经安装在您的系统上,因为它是一个工具集的一部分,这个工具集对许多其他应用程序是依赖的。

如果你没有xdg-open,你可以从xdg-utils软件包安装它,它使用任何软件包管理系统为你的Linux发行版。

另一种可能性是gnome-open ,它是Gnome桌面(准确地说是libgnome包)的一部分。 因人而异。 我们需要更多地了解您的发行版和桌面环境,才能提出更好的建议。

请注意,如果您确实想继续按扩展名选择应用程序,则可能需要考虑使用开关,而不是一系列if s:

 ... case "${filename##*.}" in txt) leafpad "$filename" ;; pdf) xdg-open "$filename" ;; *) echo "ERROR: can't open '$filename'" >&2 ;; esac 

如何在默认程序中打开文件 – Linux应该帮助您解决问题的第一部分:

 xdg-open ~/Downloads/$filename 

正如其他答案中所提到的,最好不要相信脚本中的ls输出,特别是如果在文件名中有不寻常的字符(如换行符)。 在脚本中强有力地获取文件名列表的一种方法是使用find命令,并将它们分隔到管道中。

所以要用单线来回答你的问题:

 find ~/Downloads -maxdepth 1 -type f -printf "%C@ %p\0" | sort -zrn | { read -d '' ts file; xdg-open "$file"; } 

打破它:

  • find命令列出~/Download目录中的文件,但不会深入到子目录中。 文件名以给定的printf格式打印,其中列出了一个数字时间戳,后跟一个空格,后跟一个空分隔符。 注意find的printf格式说明符与普通的printf不同
  • sort命令按数字排序(-n)第一个字段(数字时间戳)生成的空分隔列表(-z)。 排序顺序相反(-r),以便最先显示最新的条目
  • read命令将列表中第一个文件的时间戳和文件名读入到tsfile变量中。 -d ''告诉read使用空分隔符。
  • 该文件使用xdg-open

请注意, readxdg-open命令在一个大括号内联组中 ,所以file变量在两者的范围内。

mimeopen可能有用吗? 这里有一个Mime类型的解释。

另外 – 你的文件类型扩展总是正好两个字母, tail -c -3意味着什么? 如果它们长度可变,则可能需要一个正则表达式。

如前所述, xdg-openmimeopen可能会更有用,更优雅。 从他们的手册:

xdg-open在用户的首选应用程序中打开一个文件或URL。 如果提供了一个URL,URL将在用户首选的Web浏览器中打开。 如果提供了一个文件,该文件将在该类型文件的首选应用程序中打开。

[mimeopen]尝试确定文件的MIME类型,并使用默认的桌面应用程序打开它。 如果没有配置默认应用程序,则在终端中提示用户使用“打开方式”菜单。

为了更原始的脚本优雅,取代
filetype=$(echo -n $filename | tail -c -3)

filetype=${filename: -3}
而不是if / elif / fi结构的五行,考虑使用两行如下。

 [ $filetype == "txt" ] && leafpad ~/Downloads/$filename [ $filetype == "pdf" ] && evince ~/Downloads/$filename