是否可以在命令行参数中引用最近修改的文件?

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)

虽然它会处理空格、制表符和(我相信)打印特殊字符,但如果文件名包含换行符,并且可能包含其他一些非打印字符,它就会中断。


jw0*_*013 5

这是一种比 更正确和稳健的方法ls -t,但代价是增加了一些额外的复杂性。

设置

将一个简短的 shell 脚本(下面的代码)添加到您的$PATH. ~/bin是个好地方。

记得确保

  • 脚本是可执行的 chmod +x ~/bin/script_name
  • ~/bin 在你的 $PATH

用法

将要在最新文件上运行的命令传递~/Downloadlast_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但不难将其概括为支持任何目录,在这种情况下,还需要更改名称。