cat 目錄中的最後 5 個文件

cat 目錄中的最後 5 個文件

我有一個檔案名稱格式為 $date.txt 的目錄。我想從中找到 5 個最新文件。有沒有比這更優雅的解決方案

for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done

答案1

ksh93,bashzsh:

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- 將列轉置為行

相關內容