
我有一個檔案名稱格式為 $date.txt 的目錄。我想從中找到 5 個最新文件。有沒有比這更優雅的解決方案
for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done
答案1
在ksh93
,bash
或zsh
:
files=( 2*.txt )
cat "${files[@]: -5}"
這將建立一個與模式相符的檔案名稱數組2*.txt
。然後它會輸出最後五個的內容。
在 中zsh
,您還可以指定一系列文件作為其一部分全域限定符:
cat 2*.txt([-5,-1])
在任何 POSIX shell 中,這也可以透過
set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"
這會將位置參數設定為與模式相符的檔案名稱。然後,它將名稱從清單的開頭移開,直到清單中只有五個元素。 cat
然後對剩餘的檔案名稱調用。
在所有這些解決方案中,文件將按字典順序排序。帶有空格或換行符的檔案名稱可以正確處理。
答案2
我會使用 while read 循環,這將處理帶有空格的檔案。
ls 2*.txt | tail -5 | while read loop
do
cat "$loop"
done
如果您總是想要最近的 5 個,您可以將其更改為ls -tr | tail -5
答案3
根據這個問題,沒有空格和 2*.txt 很高興回到正確的順序,怎麼樣
cat $(ls 2*.txt|tail -5)
答案4
如同latest
問題中所提到的,我們可以檢查目錄中檔案的修改時間。
cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
ls -ltr
- 將列出有關修改時間戳記的文件(反向)tail -n5
- 將取得最後 5 份文件$NF
- 最後一個字段tr
- 將列轉置為行