毎月最新のバックアップファイルを除くすべて削除

毎月最新のバックアップファイルを除くすべて削除

次の名前で毎週作成される複数のファイルを含むディレクトリがあります。

 db_20130101_foo.tgz
 db_20130108_foo.tgz
 db_20130115_foo.tgz
 ...

など。数年後、ディスクはかなりいっぱいになります。ファイルには数週間分のデータが含まれているため、古いファイルを削除できます。すべてのファイルを削除したいが、常に毎月最後のファイルを保持します。作業量が多く、エラーが発生しやすいrmにファイル名を手動でコピーして貼り付けなくてもこれを行うにはどうすればよいですか?

答え1

この oneliner は削除するファイルを提供します。

(ls -1 db_*_foo.tgz; echo) awk '{prevym=ym;previous file=file; ym=substr($0,4,6);file=$0; if(ym = = prevym)ファイル} '

最初の部分は単にすべてのファイルをリストします(そしてその後のawkコマンドを単純化するためにリストの最後に追加の行を追加します)。このawkセクションでは、各行をチェックしてym(年月)が1行から次の行に変わるかどうかを確認します。

実際に削除したいファイルが上記にリストされていることをテストして確認してください。次に、すべてのファイルを削除するには、次のコマンドを入力します。

...ABOVE_COMMAND... xargs rm

答え2

正解はRubyです。group_by同じ「キー」(ファイル名の最初の9文字)を使用してファイルをインポートするための良い方法があります。

files = Dir.glob("*")
to_delete = []
files.group_by {|f| f[0,9]}.each_pair {|k,v| to_delete.push *(v.sort[0..-2])}
puts "removing: #{to_delete}"
File.delete to_delete

関連情報