如何使用 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

相關內容