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。次に、最後の5つの内容を印刷します。

では、zshファイルの範囲を次の一部として指定することもできます。グローバル予選:

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- 列を行に置き換える

関連情報