如何使用 ls 的输出打开最后修改的文件?

如何使用 ls 的输出打开最后修改的文件?

有没有办法使用ls -ltrwith的输出xargs

假设 ls 的结果是一个文件,如下所示。

ls -ltr | tail -1 | xargs -I{} open {}

为了进行比较,我使用以下命令来使用 find 来移动文件:

find ~/Downloads/ -iname '*hello*' -print0 | xargs -0 -I{} mv {} ./

我们可以以某种方式使用 NUL 字符吗?


[解决了]
正如 @illkachu 的评论中提到的,以下方法可行,但不建议这样做。

somecmd "$(ls -tr | tail -1)"

斯特凡建议的似乎是替代方案。

答案1

一般来说,您不会,因为 的输出ls无法可靠地进行后处理。

例如:

open -- "$(ls -t | head -n 1)"

如果最新文件的名称包含换行符,则不起作用。

理想情况下,您想要:

ls -zt | head -zn1 | xargs -r0 open --

但不幸的是,我不知道有任何支持/选项ls的实现,并且-z-0GNU 的维护者ls至少多次拒绝添加它

现在,还有其他一些实现方式。

对于 , 在 C 语言环境中的 GNU 和 ast-open 实现ls,带有该选项的输出--quoting-style=shell-always可通过zsh,ksh93或进行后处理bash

export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"

open -- "${files[0]}" # $files[1] with zsh

虽然在 zsh 中,你只需这样做

open ./*(om[1])

或者:

打开 。/Ctrl+Xm

aszsh内置支持按修改时间(以及远远超出ls功能的许多其他标准)对文件进行排序。

FreeBSDls有一个--libxo选项来生成 json 或 xml 输出,所以你可以这样做:

ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
  print decode_json($_)
    ->{"file-information"}
    ->{directory}->[0]
    ->{entry}->[0]
    ->{name}' | xargs -r0 open --

但这样的话,在 中完成整个事情会更简单perl

答案2

正如您已经被告知的:一般来说,这不是您想要选择的方法。然而,作为一个开始:

ls -ltr | awk '/^-/ { print $9; }' | xargs

相关内容