ディレクトリ内の最後の 5 つのファイルを cat する

ディレクトリ内の最後の 5 つのファイルを cat する

$date.txtという形式のファイル名を持つディレクトリがあります。そこから最新の5つのファイルをcatしたいと思います。これよりもエレガントな解決策はありますか?

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。その後、最後の 5 つの内容が出力されます。

ではzsh、ファイルの範囲をその一部として指定することもできます。glob 修飾子:

cat 2*.txt([-5,-1])

POSIXシェルでは、これは次のように実行することもできます。

set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done   # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"

これにより、位置パラメータがパターンに一致するファイル名に設定されます。次に、リストの先頭から名前がシフトされ、リストに 5 つの要素のみが含まれるようになります。 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- 列を行に転置する

関連情報