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
変換され、数値ソートに使用されます。some123file5123with3numbers
123-5123-3
n