我有一个目录,其中包含许多每周生成的文件,其名称如下
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