有沒有辦法使用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