【问题标题】:bash: Delete all files older than 1 month, but leave files from Mondaysbash:删除所有超过 1 个月的文件,但保留星期一的文件
【发布时间】:2013-11-30 19:32:04
【问题描述】:

我有很多日常备份档案。为了管理磁盘使用情况,我需要一个 bash 脚本来删除所有超过 1 个月的文件,但保留在星期一创建的所有文件,即使它们超过 1 个月。

例如,这将删除所有上次修改时间超过 30 天前的文件:

 find /path/to/files* -type f -mtime +30 -delete

但我真的不知道如何保存星期一创建的文件。

【问题讨论】:

  • 这将删除所有早于 30j 的文件。查找 / -name "*" -mtime +30 -exec rm -f {}\;你的意思是你想保留星期一创建的文件,即使它们早于 1 个月?
  • 是的,没错。会改变问题

标签: bash sh


【解决方案1】:

如何避免循环中的子进程:

find /path/to/files -type f -mtime +30 -printf '%Ta %p\n' \
    | grep -v ^Mon | cut -c5- | tr "\n" "\0" | xargs -0 rm -v

【讨论】:

    【解决方案2】:

    据我所知find 没有工作日检查,您需要调用外部程序。

    find /path/to/files -type f -mtime +30 \
        -exec sh -c \
            '[ "$(date +%u -d @"$(stat -c %Y "$1")")" != 1 ] && rm "$1"' -- {} \;
    

    更新:使用-r 切换到date(对 Janos 表示敬意)并且只测试,而不是在 shell 命令中删除可能会产生最干净的版本:

    find /path/to/files -type f -mtime +30 \
        -exec sh -c 'test "$(date +%u -r "$1")" != 1' -- {} \; \
        -print  # or -delete instead
    

    【讨论】:

      【解决方案3】:

      @JoSo 回答的稍微简单和谨慎的版本:

      find /path/to/files -type f -mtime +30 \
          -exec sh -c 'test $(date +%a -r "$1") = Mon || echo rm "$1"' -- {} \;
      

      区别:

      • 使用date -r直接获取文件的最后修改日期
      • 使用%a 处理更易于理解的工作日名称
      • 只需先回显rm "$1" 即可查看将要删除的内容。如果看起来不错,那么要么在最后粘贴 | sh 以真正执行,要么删除 echo

      不过,@JoSo 正确地指出 date +%a 依赖于语言环境,因此这些版本确实更安全:

      find /path/to/files -type f -mtime +30 \
          -exec sh -c 'test $(date +%u -r "$1") = 1 || echo rm "$1"' -- {} \;
      find /path/to/files -type f -mtime +30 \
          -exec sh -c 'test $(LC_TIME=C date +%a -r "$1") = Mon || echo rm "$1"' -- {} \;
      

      【讨论】:

      • 感谢-r 开关。但我宁愿不使用%a,因为它取决于语言环境。将 LC_TIME=C 添加到 date 命令之前可能是安全的。
      【解决方案4】:

      你可以使用

      stat -c %y yourfile
      

      获取文件的创建日期。

      然后使用 cut 提取日期以获得类似 myvar=yyyymmdd 的变量

      最后使用

      date +%u --d $myvar
      date +%u --d 20130822
      

      它将返回星期几,如果返回 1 则表示星期一。 就我而言,它返回 4,因为 22/08/2013 是星期四

      编辑:如果您可以按照 Jo So 的建议将所有这些都作为一个简单的命令行工作,那就更好了!

      【讨论】:

        猜你喜欢
        • 2020-01-29
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 2023-03-04
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多