Cronjob:删除至少 50GB 的最旧文件,同时保留目录中的 2 个文件

Cronjob:删除至少 50GB 的最旧文件,同时保留目录中的 2 个文件

我运行了一个备份脚本,该脚本每天会将大约 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 -1head -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

相关内容