每月删除除最新备份文件之外的所有内容

每月删除除最新备份文件之外的所有内容

我有一个目录,其中包含许多每周生成的文件,其名称如下

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

等等。多年来,磁盘将变得相当满。由于文件包含几周的数据,我们可以删除较旧的文件。我想删除每个文件,但始终保留每个月的最后一个文件。我如何才能完成此任务,而不必手动将文件名复制并粘贴到 rm,这需要大量工作并且很容易出错?

答案1

此 oneliner 将为您提供要删除的文件:

(ls -1 db_*_foo.tgz; 回声) | awk '{prevym=ym;上一个文件=文件; ym=substr($0,4,6);文件=$0; if (ym==prevym)打印上一个文件}'

第一部分仅列出所有文件(并在列表末尾添加额外的行,以简化后面的 awk 命令)。该awk部分仅检查每一行以查看ym(年月)是否从一行更改为下一行。

测试并确保上面列出了您确实要删除的文件。然后,要删除所有文件,只需将命令输入:

...ABOVE_COMMAND... | xargs rm

答案2

外面的答案:红宝石。它有一个很好的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

相关内容