查找最新的 x 个子文件夹并保留它们,同时删除其余的

查找最新的 x 个子文件夹并保留它们,同时删除其余的

我有一个每天运行一次的备份脚本。它将备份保存在备份文件夹下方以日期 ( $(date +"%F")) 命名的子文件夹中。

另一个用于清理的脚本应每周运行一次。我希望此脚本保留最新的 10 个备份并删除所有其他备份。

目前,我只需通过调用 即可删除超过 10 天的所有内容find $PWD -type d -ctime +10 -exec rm -rf {} +。但如果由于尚未意识到的错误(不应该发生但可能会发生)在过去 10 天内没有任何备份,这可能会破坏所有备份。

如果脚本将可用备份的数量保持在 10 个或更多,那么就不会发生危险的事情。

那么如何只保留最新的X子文件夹并删除所有其他文件夹

答案1

由于您的子目录命名合理,因此您可以使用以下命令删除除最近的 10 个子目录之外的所有子目录:

ls -d */ | head -n-10 | xargs rm -rf

逐一执行上述命令:

  • ls -d */按字母顺序打印出子目录。由于子目录是按日期命名的$(date +"%F"),因此这与从最旧到最新的列表相同。

  • head -n-10打印除最后十行之外的所有内容。因此,这将打印除最近十个子目录之外的所有内容。

  • 该命令xargs rm -rf将删除从 收到的所有文件名head -n-10

测试时,您可能需要尝试:

ls -d */ | head -n-10 | xargs echo rm -rf

这将向您显示rm将执行什么命令,而无需实际执行它。

上述操作不适用于名称中包含空格、制表符或换行符的子目录。

相关内容