以下是我对此问题的尝试。它是一个功能性脚本,但我必须指定要用于每种文件类型的应用程序。由于有关默认应用程序的信息必须已经存储在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
答案 0 :(得分:2)
How do I open a file in its default program - 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格式打印,该格式列出了数字时间戳,后跟空格,后跟空分隔符。请注意printf format specifiers for find
与常规printf sort
command通过第一个字段(数字时间戳)对生成的以空分隔的列表(-z)进行数字排序(-n)。排序顺序相反(-r),以便首先显示最新条目read
命令将列表中第一个文件的时间戳和文件名读入ts
和file
变量。 -d ''
告诉read
使用空分隔符。xdg-open
打开文件。请注意,read
和xdg-open
命令位于curly bracket inline group中,因此file
变量适用于两者。
答案 1 :(得分:1)
答案 2 :(得分:1)
如前所述,xdg-open
和mimeopen
可能更有用,更优雅;从他们的联机帮助页:
xdg-open在用户的首选应用程序中打开文件或URL。如果提供了URL,则将在用户首选的Web浏览器中打开URL。如果提供了文件,则将在首选应用程序中为该类型的文件打开该文件。
[mimeopen]尝试确定文件的mimetype并使用默认桌面应用程序打开它。如果未配置默认应用程序,则会在终端中通过“打开方式”菜单提示用户。
为了在原始脚本中更加优雅,请替换为
filetype=$(echo -n $filename | tail -c -3)
与
filetype=${filename: -3}
而不是五行if
/ elif
/ fi
结构,请考虑使用以下两行。
[ $filetype == "txt" ] && leafpad ~/Downloads/$filename
[ $filetype == "pdf" ] && evince ~/Downloads/$filename
答案 3 :(得分:1)
欢迎使用bash编程。 : - )
首先,我会将您推荐给Bash FAQ。很棒的资源,很多提示,观点和警告。
其中一个是您的脚本遭受的经典 Parsing LS 问题。基本思想是你不想信任ls
命令的输出,因为空格和控制字符之类的特殊字符可能以不允许你引用的方式表示到文件。
您正在打开“last”文件,由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
:
...
case "${filename##*.}" in
txt)
leafpad "$filename"
;;
pdf)
xdg-open "$filename"
;;
*)
echo "ERROR: can't open '$filename'" >&2
;;
esac