web-dev-qa-db-ja.com

最後に作成/変更されたファイルから最後の5行を表示する方法は?

毎日バックアップを取り、ステータスを更新して、特定の時間にチームをサポートする必要があります。この場合、ディレクトリで最後に作成/変更された*.affファイルの最後の5行をチェックして更新する必要があります。

誰かが*.affファイルのようにLinuxで最後に変更されたファイル(特定の拡張子)の最後の5行を表示する方法を教えてもらえますか?他のファイルも作成されます。 *.logなど.

6
Ashish

zshシェルの場合:

tail -n 5 ./*.aff(D.om[1])

他のシェルでは、ファイル名に含まれる可能性のあるものを推測したくない場合、信頼できるものを思い付くのは非常に困難です。

たとえば、最近のGNUシステムを使用している場合、bashと同等のものは次のようになります。

find . -maxdepth 1 -name '*.aff' -type f -printf '%T@:%p\0' |
  sort -rzn |
  sed -zn 's/[^:]*://p;q' |
  xargs -r0 tail -n 5

または:

find . -maxdepth 1 -name '*.aff' -type f -printf '%T@/%p\0' |
  sort -rzn | (IFS=/ read -rd '' mtime file && tail -n 5 "$file")
7

ファイル名に改行文字が含まれておらず、すべての*.affファイルが通常のファイルであると仮定します。

ls -t1d -- *.aff | head -n 1

最近変更された.aff-ファイルの名前を示します。最後の5行が必要な場合は、次のようにします。

tail -n 5 -- "$(ls -t1d -- *.aff | head -n 1)"
5
Costas

すべてのGNUシステムおよびBusyboxで機能するはずの別の安全なアプローチ:

tail -n5 "$(stat -c "%Y %n" ./* | 
    sort -nk1,1 | cut -d ' ' -f 2- | tail -n1)"

これはほとんどの場合に機能しますが、ファイル名に改行を含めることができる場合は、代わりにこれを使用してください(GNUのみ、ファイルが改行で終わる場合でも壊れます)。

tail -n5 "$(stat --printf "%Y %n\0" ./* | 
    sort -rznk1,1 | sed -zn 's/[0-9]\+ //p;q')"
0
terdon