Ls
將 ls 的結果通過管道傳送到尾部
我有一個包含一堆日誌文件的目錄。像這樣的東西:
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