Ls

將 ls 的結果通過管道傳送到尾部

  • January 24, 2019

我有一個包含一堆日誌文件的目錄。像這樣的東西:

data170213.log
data170214.log
data170215.log
data170216.log

我有興趣查看最新文件的最後條目並關注它。如果我知道最近的文件是data170216.log,我可以這樣做

tail -f data170216.log

問題是,我不知道目錄中最新文件的名稱是什麼。我可以辨識它

ls -1r *.log | head -1

我無法解決的是如何發送命令ls -1r *.log |的結果 head -1到命令tail -f$$ FILE $$

我嘗試了以下,不成功

tail -f < ls -1r *.log | head -1

使用命令替換

tail -f "$(ls -1r *.log | head -n 1)"

ls -1r *.log | head -n 1在一個子shell中執行,獲取它的輸出,並使用它建構一個新命令;所以如果ls管道輸出data170216.log,命令變成

tail -f "data170216.log"

這就是你所追求的。

注意head -n 1而不是head -1; 後一種形式現在已棄用。

您可以xargs在這種情況下使用。可能是簡單易行的一個是:

$ ls -1r *.log | sed -n 1p | xargs tail -f

或者:

$ ls -1r *.log | head -1 | xargs tail -f

兩者都工作正常。

man xargs

例子

在 /tmp 目錄中或目錄下找到名為 core 的文件並將其刪除。請注意,如果有任何文件名包含換行符或空格,這將無法正常工作:

find /tmp -name core -type f -print | xargs /bin/rm -f

在目錄 /tmp 中或目錄下查找名為 core 的文件並刪除它們,以正確處理包含空格或換行符的文件或目錄名稱的方式處理文件名:

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

在目錄 /tmp 中或目錄下查找名為 core 的文件並刪除它們,以正確處理包含空格或換行符的文件或目錄名稱的方式處理文件名:

find /tmp -depth -name core -type f -delete

在 /tmp 目錄中或目錄下找到名為 core 的文件並刪除它們,但比上一個範例更有效(因為我們避免使用 fork(2) 和 exec(2) 來啟動 rm 並且我們不需要額外的 xargs 程序)

生成系統上所有使用者的緊湊列表:

cut -d: -f1 < /etc/passwd | sort | xargs echo

一個接一個地啟動所需的最小數量的 Emacs 副本,以編輯 xargs 標準輸入中列出的文件。這個例子實現了與 BSD 的 -o 選項相同的效果,但以更靈活和可移植的方式:

xargs sh -c 'emacs "$@" < /dev/tty' emacs

引用自:https://unix.stackexchange.com/questions/345477