【问题标题】:How to delete files older than X hours如何删除超过 X 小时的文件
【发布时间】:2010-09-19 23:00:56
【问题描述】:

我正在编写一个需要删除旧文件的 bash 脚本。

目前使用:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

这将删除超过 1 天的文件。

但是,如果我需要 1 天(比如 6 小时前)的更精细分辨率怎么办?有没有一种干净的方法,比如使用 find 和 -mtime?

【问题讨论】:

    标签: bash


    【解决方案1】:

    您的find 是否有-mmin 选项?这可以让您测试自上次修改以来的分钟数:

    find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete
    

    或者也许看看使用tmpwatch 来做同样的工作。 phjr 还在 cmets 中推荐了tmpreaper

    【讨论】:

    • 使用 --mmin +X 会返回所有包含我查找的文件。我没有先检查这个是我的错,但是这个命令刚刚删除了我的大部分主目录。对我来说,--mmin -X 是正确的论点。
    • tmpreaper 是 tmpwatch 的一个分支。它更安全,并且作为发行版中的 debian 包存在。 find -delete 的好处:tmpreaper 不会删除符号链接、套接字、fifos 或特殊文件
    • 指出 $REQUIRED_FILES 需要用引号引起来(双引号),您可以对所有 .txt 文件或以如下模式开头的文件使用类似“.txt”的模式: "temp-" 删除所有以 temp- 命名的文件
    • @PaulDixon 如何修改这个,使$LOCATION$REQUIRED_FILES 都可以有多个值,例如dir1 dir2*.txt *.tmp
    • @Enissay $LOCATION 是单个目录。对于多个扩展,您可能希望使用带有 -regex 的模式 - 请参阅 stackoverflow.com/questions/5249779/…
    【解决方案2】:

    这是对我有用的方法(我没有看到它在上面使用)

    $ find /path/to/the/folder -name '*.*' -mmin +59 -delete > /dev/null
    

    删除所有超过 59 分钟的文件,同时保持文件夹不变。

    【讨论】:

    • 最好用单引号 '*.*' 或 shell 将其扩展为实际文件名,而不是将其保留为通配符以供 find 解析。这打破了find 对子目录的递归操作。
    • 另外请注意-name '*.*'不会删除没有扩展名的文件,例如READMEMakefile等。
    • 如果您只想匹配文件,请改用-type f
    【解决方案3】:

    您可以使用这个技巧:在 1 小时前创建一个文件,并使用 -newer file 参数。

    (或者使用touch -t创建这样的文件)。

    【讨论】:

    • 没有 -older 开关(至少在我的 find 命令中),这就是需要的。 -newer 没有帮助。
    • 你能给出一个 touch 命令来生成一个 1 小时前的文件,该文件可以在不能使用 -mmin 的机器上运行吗? (如果你在 Linux 上,-mmin 是可用的,如果不是,那么 date 和其他命令相比之下也很弱。)
    • @iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test 创建文件 test 总是 1 小时前。
    • 你也可以通过-not -newer X来实现你想要的
    • rm 早于file.ext 的文件和目录运行rm -r `find -maxdepth 1 -not -newer file.ext`。对于rmfile.ext 更新的文件和目录,请执行rm -r `find -maxdepth 1 -newer file.ext`。要将file.ext 放置在您想要的位置,请及时运行touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) file.ext,其中'-1 hour' 指定“1 小时前”。信用:xoftlrovr138nickf
    【解决方案4】:

    -mmin 表示分钟。

    尝试查看手册页。

    man find
    

    更多类型。

    【讨论】:

      【解决方案5】:

      适用于 SunOS 5.10

       Example 6 Selecting a File Using 24-hour Mode
      
      
       The descriptions of -atime, -ctime, and -mtime use the  ter-
       minology n ``24-hour periods''. For example, a file accessed
       at 23:59 is selected by:
      
      
         example% find . -atime -1 -print
      
      
      
      
       at 00:01 the next day (less than 24 hours  later,  not  more
       than one day ago). The midnight boundary between days has no
       effect on the 24-hour calculation.
      

      【讨论】:

        【解决方案6】:

        如果一个人的find 没有-mmin,并且如果一个人也被一个find 卡住,它只接受-mtime 的整数值,那么如果一个人认为“早于”是类似于“不比”。

        如果我们能够创建一个具有我们截止时间的 mtime 的文件,我们可以要求 find 找到“不比”我们的参考文件“新”的文件.

        创建一个具有正确时间戳的文件有点麻烦,因为没有足够的find 的系统可能还有一个功能不足的date 命令,它可以执行以下操作:@ 987654328@.

        幸运的是,其他旧工具可以解决这个问题,尽管方式更加笨拙。

        要开始寻找删除超过六个小时前的文件的方法,我们首先必须找到六个小时前的时间。假设 6 小时是 21600 秒:

        $ date && perl -e '@d=localtime time()-21600; \
          printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
        > Thu Apr 16 04:50:57 CDT 2020
        202004152250.57
        

        由于perl 语句产生了我们需要的日期/时间信息,所以使用它来创建一个正好有六个小时前的参考文件:

        $ date && touch -t `perl -e '@d=localtime time()-21600; \
          printf "%4d%02d%02d%02d%02d.%02d\n", \
          $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
        Thu Apr 16 04:53:54 CDT 2020
        -rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file
        

        现在我们有一个正好六小时前的参考文件,“删除所有超过六小时的文件”的“旧 UNIX”解决方案变成了以下内容:

        $ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;
        

        清理我们的参考文件也可能是个好主意...

        $ rm -f ref_file
        

        【讨论】:

          【解决方案7】:

          如果您的“find”版本中没有“-mmin”,那么“-mtime -0.041667”会非常接近“在过去一小时内”,因此在您的情况下,请使用:

          -mtime +(X * 0.041667)
          

          所以,如果 X 表示 6 小时,那么:

          find . -mtime +0.25 -ls
          

          有效,因为 24 小时 * 0.25 = 6 小时

          【讨论】:

          • 很有希望,因为这个旧的 UNIX 没有 -mmin,但遗憾的是,这没有帮助,因为这个旧的 UNIX 也不喜欢 mtime 的小数值:find: argument to -mtime must be -2147483647 到 2147483647 范围内的整数
          【解决方案8】:

          这是@iconoclast 在他们的comment 另一个答案中想知道的方式。

          对用户使用 crontab 或 /etc/crontab 创建文件 /tmp/hour

          # m h dom mon dow user  command
          0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1
          

          然后使用它来运行你的命令:

          find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;
          

          【讨论】:

            【解决方案9】:

            find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-07-19
              • 1970-01-01
              • 1970-01-01
              • 2021-09-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多