![Cronjob:删除至少 50GB 的最旧文件,同时保留目录中的 2 个文件](https://linux22.com/image/1180131/Cronjob%EF%BC%9A%E5%88%A0%E9%99%A4%E8%87%B3%E5%B0%91%2050GB%20%E7%9A%84%E6%9C%80%E6%97%A7%E6%96%87%E4%BB%B6%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%9D%E7%95%99%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%202%20%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我运行了一个备份脚本,该脚本每天会将大约 300GB 的备份文件创建到备份文件夹中。该备份文件夹中还有一些较小的文件(小于 50GB)。
我想使用 cronjob 保留最近 2 个大于 50GB 的文件,同时忽略较小的文件。删除最旧的文件,同时目录中至少有 2 个文件
到目前为止我尝试过这个:
find . -type f -size +50G -printf '%T+ %p\n' | sort | head -n 1 | awk '{print $NF}' | xargs rm -f
这会对列表中大于 50GB 的文件进行排序,并删除最旧的文件。
我不知道如何确保它至少保留 2 个文件,每个文件至少 50GB。在我的想象中,我应该计算大于 50GB 的文件数量,按日期排序,然后删除最旧的文件?我遗漏了什么吗?我是否应该以某种方式删除除最新的 2 个文件之外的所有文件?
任何提示/建议都值得赞赏。谢谢。
答案1
你几乎成功了(为了便于阅读,我们将其分成几行)
find . -type f -size +50G -printf '%T+ %p\n' |
sort -r |
awk 'NR>2 {print $2}' |
xargs rm -f
在哪里
sort -r
将首先列出最新文件NR>2
将从第 3 行开始选择{print $2}
将打印文件名(假设文件名没有空格、制表符或换行符)
答案2
未经我的机器测试,因为我没有大文件,或者我想删除的文件...YMMV
我排除了basename $keepfile
第二条 find 语句中的,希望您的文件具有唯一的名称。
如果它们没有唯一的名称,您可能需要head -n 2 | tail -1
用head -3 | tail -1
...替换,但这将始终删除最旧的文件。
如果该系统用于日志轮换,您最好查看 syslog.conf,并添加这些文件以实现自动轮换和清理。
keepfile=`find . -type f -size +50G -printf '%T+ %p\n' | sort -r | head -n 2 | tail -1 | awk '{print $NF}'`
find . -type f -size +50G ! -newer $keepfile ! -name `basename $keepfile` -exec rm {} \; -print