以下是我在这个问题上的尝试。 这是一个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
命令将列表中第一个文件的时间戳和文件名读入到ts
和file
变量中。 -d ''
告诉read
使用空分隔符。 xdg-open
。 请注意, read
和xdg-open
命令在一个大括号内联组中 ,所以file
变量在两者的范围内。
mimeopen
可能有用吗? 这里有一个Mime类型的解释。
另外 – 你的文件类型扩展总是正好两个字母, tail -c -3
意味着什么? 如果它们长度可变,则可能需要一个正则表达式。
如前所述, xdg-open
和mimeopen
可能会更有用,更优雅。 从他们的手册:
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