设置

设置

我经常从浏览器下载带有令人发指的数字文件名的 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

用法

将要在最新文件上运行的命令传递~/Downloadlast_download.

例子

假设您为脚本命名last_download

  • last_download(无参数):evince在最新文件上运行默认命令~/Downloads
  • last_download mplayermplayer:在最新的文件上运行~/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

相关内容