![查找最新的 x 个子文件夹并保留它们,同时删除其余的](https://linux22.com/image/1417880/%E6%9F%A5%E6%89%BE%E6%9C%80%E6%96%B0%E7%9A%84%20x%20%E4%B8%AA%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B9%B6%E4%BF%9D%E7%95%99%E5%AE%83%E4%BB%AC%EF%BC%8C%E5%90%8C%E6%97%B6%E5%88%A0%E9%99%A4%E5%85%B6%E4%BD%99%E7%9A%84.png)
我有一个每天运行一次的备份脚本。它将备份保存在备份文件夹下方以日期 ( $(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
将执行什么命令,而无需实际执行它。
上述操作不适用于名称中包含空格、制表符或换行符的子目录。