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