DQd*_*dlM 7 command-line bash date wildcards files
我经常从浏览器下载带有令人发指的数字文件名的 PDF 文件。这些自动进入~/Downloads
. 理想情况下,我希望能够打开这些文件:
evince "the most recently modified file"
Run Code Online (Sandbox Code Playgroud)
无需打开~/Downloads
查找文件名。
有没有一种简单的方法来指定“最近修改的文件” bash
?
注:我知道这是可以做到这一点,但理想的我期待的,这将是比简单的解决方案ls -t
“荷兰国际集团~/Downloads
,以检查该名称。
Kev*_*vin 10
evince "$(ls -t | head -n1)"
Run Code Online (Sandbox Code Playgroud)
虽然它会处理空格、制表符和(我相信)打印特殊字符,但如果文件名包含换行符,并且可能包含其他一些非打印字符,它就会中断。
这是一种比 更正确和稳健的方法ls -t
,但代价是增加了一些额外的复杂性。
将一个简短的 shell 脚本(下面的代码)添加到您的$PATH
. ~/bin
是个好地方。
记得确保
chmod +x ~/bin/script_name
~/bin
在你的 $PATH
将要在最新文件上运行的命令传递~/Download
给last_download
.
假设您将脚本命名为 last_download
last_download
(无参数):evince
在最新文件上运行,默认命令~/Downloads
last_download mplayer
:mplayer
在最新的文件上运行~/Downloads
last_download cp -t ~/Desktop
: 将最新的文件复制~/Downloads
到~/Desktop
#!/bin/sh
# Usage: last_download [cmd [options]...]
newest=
dir=~/Downloads
# default command
if [ $# -eq 0 ]; then
set -- evince;
fi
# find newest file
for f in "$dir"/*; do
if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
newest="$f"
fi
done
if ! [ -e "$newest" ]; then
exit 1
fi
# run command on newest file
"$@" "$newest"
Run Code Online (Sandbox Code Playgroud)
注意:该脚本仅查看,~/Download
但不难将其概括为支持任何目录,在这种情况下,还需要更改名称。