我经常从浏览器下载带有令人发指的数字文件名的 PDF 文件。这些会自动进入~/Downloads
.理想情况下,我希望能够使用以下命令打开这些文件:
evince "the most recently modified file"
无需打开即可~/Downloads
查找文件名。
有没有一种简单的方法来指定“最近修改的文件” bash
?
注意:我知道这是可能的来做到这一点,但理想情况下我正在寻找一种比ls -t
'ing~/Downloads
检查名称更简单的解决方案。
答案1
evince "$(ls -t | head -n1)"
虽然它可以处理空格、制表符和(我相信)打印特殊字符,但如果文件名包含换行符,并且可能包含其他一些非打印字符,它就会中断。
答案2
这是一种比 更正确、更稳健的方法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"
注意:该脚本仅查找,~/Download
但将其概括为支持任何目录并不困难,在这种情况下,也需要更改名称。
答案3
exec zsh
evince ~/Downloads/*.pdf(om[1])
或者如果您不想切换到 zsh
cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'
括号之间的位是全局限定符。om
更改 glob 的顺序以使用修改时间而不是名称(最新的在前)。[1]
意味着仅使用第一个匹配项。
有关更多信息,请参阅这是“如何在 zsh 中过滤 glob”的答案。
答案4
不,即使有,您也无法确定某些系统日志通常不是最近更新的文件。
如果你只是想避免,凯文的回答(他先于我)有效手动开幕~/Downloads
。