[Linux] Bashで一定件数以上のファイルを削除する

日次バッチなどを作っていると、例えばバックアップファイルは最新30件だけ保存し、それ以上古いファイルは削除したいといった気持ちになりますよね。そんな時に利用するのが次のワンライナー。

$ cd backup/
$ rm -f `ls -t . | tail -n+31`

これだと30日前の日付を計算して毎回削除するといった処理を書かなくて済みます。厳密にn日分確保する必要がある場合は日付の計算を行った方が良いでしょうが、念の為一定期間取っておきたいくらいのゆるい要件であれば十分でしょう。

  • 保存しておきたいファイル数に「+1」することをお忘れなく。
  • ディレクトリを削除する場合はrmに-rをつけてください。

オプションの意味

ls -t
ファイルの更新日でソートし、新しい物から順番に出力します(sort by modification time, newest first)
tail -n
ファイルの末尾から指定行数を出力します。-10なら最後の10行。-n+10ならファイルの先頭10行をスキップしそれ以降を出力せよという意味になります(output the last K lines, instead of the last 10; or use -n +K to output starting with the Kth)

参考