有没有办法使用ls -ltr
with的输出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
-0
GNU 的维护者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