最新のファイル以外のファイルを番号順に削除

最新のファイル以外のファイルを番号順に削除

Bashスクリプトからファイルを削除しようとしています。

最新のファイルを一覧表示できます。

ls | grep core | tail -n 1

名前をに変更し、keep-core-2994-xyz.bin残りを削除します。

rm -f core-*

次に、最新の名前を元の名前に変更します。これにより、最新のファイルを保持して残りのファイルを削除できます。これは次の状況に適しています。

-rw-------  1 root root  47M Sep  3  2017 core-2994-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

しかし、これはcore-10000-xyz.bin問題を引き起こしました。

-rw-r--r--  1 root root  55M Sep  3  2017 core-10000-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

head…今回は一緒ではなく、私が望む人と一緒にしなければならないからだ… tail

このコマンドで生成された最新のファイル以外のファイルを削除する効率的な方法はありますか? (ここ、core-3012-xyz.bin

ファイルタイムスタンプは信頼できません。これは組み込みのデバイスであり、インターネット接続によってタイムスタンプが変更される可能性があるため、タイムスタンプごとにリストすることはできません。

これは組み込みデバイスであり、zshでコンパイルしたくありません。 bash専用のソリューションが欲しい。

答え1

そしてzsh

rm -f -- *core*(n[1,-2])

ここで、glob修飾子はオンにnなり、そのglob拡張の最初から最後まで2番目を選択します。numericglobsort[1,-2]

または:

rm -f core-<1-4294967295>-xyz.bin(n.[1,-2])

より具体的にしたい場合は、<1-2147483647>有効なPID番号の範囲内の数字を表す数値シーケンスを一致させ、修飾子は.拡張を次に制限します。定期的なファイルのみ。

core-bar-123整理されていますので参考にしてください今後 core-bar-1000そして以前にもcore-foo-1。数値ソートは、数値を比較する前の部品が同じ場合に使用されます。ここでcore-bar最初に並べ替えてくださいcore-foo。どちらに数字を追加しても変更されません。

ソート時に数字のみを考慮するには、次のようにします。

extract_numbers() {
  set -o localoptions -o extendedglob
  REPLY=${${${REPLY//[^0-9]##/-}#-}%-}
}
rm -f --  *<->*(.no+extract_numbers[1,-2])

whereはwhichにextract_numbers変換され、数値ソートに使用されます。some123file5123with3numbers123-5123-3n

答え2

ああ、解決策を見つけました。

ls -v | grep core | tail -n 1

動作します。

引用:

数値順に並べられたファイルのリスト

関連情報