繁体   English   中英

如何保留最新的 8 个备份文件并删除旧的

[英]How do I keep latest 8 backup file and delete the older one

如何保留最新的 8 个备份文件并删除旧的

backup-Y-M-D.zip
backup-Y-M-D.zip
backup-Y-M-D.zip
backup-Y-M-D.zip
.
.
backup-Y-M-D.zip

大约有 80 个具有 .zip 扩展名的文件,我想做的就是根据创建日期保留最新的 8 个文件。 我也尝试了 logrotate 但未能旋转日志,因为它没有做任何事情。 下面是logrotate的配置文件。

/root/test/*.zip {
    daily
    missingok
    extension .zip
    rotate 4
    nocompress 
}

如果保证命名约定,您可以在扩展 glob 模式时仅依赖文件的字母顺序来获取最旧或最新的文件。 根据文件名扩展

分词后,除非设置了 -f 选项(请参阅 The Set Builtin),否则 Bash 会扫描每个单词中的字符 '*'、'?' 和 '['。 如果出现这些字符之一,并且没有被引用,则该单词被视为一个模式,并替换为按字母顺序排序的与该模式匹配的文件名列表(请参阅模式匹配)。

演示:

[user@hostname]$ touch backup-2022-06-14.zip backup-2022-06-13.zip backup-2021-07-04.zip
[user@hostname]$ echo *
backup-2021-07-04.zip backup-2022-06-13.zip backup-2022-06-14.zip

您可以利用它来获取除最后 N 个元素之外的文件列表:

[user@hostname]$ all_files=(*)
[user@hostname]$ old_files=( "${all_files[@]:0:${#all_files[@]}-1}" ) #change -1 to -8 if you want to keep the 8 newest
[user@hostname]$ echo "${old_files[@]}"
backup-2021-07-04.zip backup-2022-06-13.zip

然后对该列表执行任何操作,例如使用rm "${old_files[@]}"将其删除。

一种方法是使用以下单行代码,从日志所在的目录运行:

ls -t | head -n -8 | xargs --no-run-if-empty rm

解释:

  • ls -t - 按从新到旧的顺序列出所有文件
  • head -n -8 - 获取除前 8 个文件之外的所有文件
  • xargs --no-run-if-empty rm - 如果有任何选定的文件,则删除,如果您的日志少于 8 个,则防止错误

如果您想将其设置为每天自动运行,让您高枕无忧,以防您的服务器在一个周期的第 7 天离线并错过一周标记,请运行crontab -e并将以下内容添加到您的作业中:

0 0 * * * cd yourDirNameHere && ls -t | head -n -8 | xargs --no-run-if-empty rm

然后日志清理器将在每晚午夜运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM