【问题标题】:Deleting oldest files with shell使用 shell 删除最旧的文件
【发布时间】:2012-09-10 22:34:37
【问题描述】:

我有一个文件夹 /var/backup,cronjob 在其中保存数据库/文件系统的备份。它包含一个 latest.gz.zip 和许多名为 timestamp.gz.zip 的旧转储。 文件夹越来越大,我想创建一个执行以下操作的 bash 脚本:

  • 保留最新的.gz.zip
  • 保留最年轻的 10 个文件
  • 删除所有其他文件

不幸的是,我不是一个好的 bash 脚本编写者,所以我不知道从哪里开始。感谢您的帮助。

【问题讨论】:

标签: shell


【解决方案1】:

在 zsh 中,您可以使用扩展标志来完成大部分工作:

files=(*(.Om))
rm $files[1,-9]

小心这个命令,你可以检查匹配的内容:

print -rl -- $files[1,-9]

【讨论】:

    【解决方案2】:

    您应该学习使用find 命令,可能与xargs 一起使用,类似于

     find /var/backup -type f -name 'foo' -mtime -20 -delete
    

    或者如果您的find 没有-delete

     find /var/backup -type f -name 'foo' -mtime -20 -print0 | xargs -0 rm -f
    

    当然你需要改进很多,这只是提供想法。

    【讨论】:

    • 很酷,谢谢你的提示。我发现 find /var/backup -mtime +3 -delete(超过 3 天的文件)对我来说是一个很好的解决方案。
    • 当使用xargs 版本时,您绝对应该坚持使用find . -print0 | xargs -0 cmd 的形式。这可确保正确处理包含空格的文件名。 -print0 告诉 find 发出以 NULL 字符结尾的匹配项,-0 告诉 xargs NULL 字符是分隔符。
    • 坚持这种形式也可以最大程度地降低安全风险:gnu.org/software/findutils/manual/html_mono/…
    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多