【问题标题】:How can I remove a file based on its creation date time in Perl?如何根据 Perl 中的创建日期时间删除文件?
【发布时间】:2025-11-27 06:30:01
【问题描述】:

我的 webapp 托管在使用 MySQL 作为数据库的 unix 服务器上。

我编写了一个 Perl 脚本来运行我的数据库备份。 Perl 脚本位于 cgi-bin 文件夹中,它正在工作。我只需要设置 cronjob 并每天运行一次 Perl 脚本。

备份存储在名为 db_backups 的文件夹中。但是,我还想在我的 Perl 脚本中添加一个命令,以删除文件夹 db_backups 中比 10 天前更早的所有文件。

我已经搜索了 unix 命令的高位和低位,但找不到任何符合我需要的东西。

【问题讨论】:

    标签: perl file


    【解决方案1】:

    if (-M $file > 10) { unlink $file }

    或者,加上File::Find::Rule

    my $ten_days_ago = time() - 10 * 86400;
    my @to_delete = File::Find::Rule->file()
      ->mtime("<=$ten_days_ago")
      ->in("/path/to/db_backup");
    unlink @to_delete;
    

    【讨论】:

    • 顺便问一下,有什么资源可以帮助我更快地学习 perl 吗?我知道一些简单的php和java。我不是很好。大多数在线资源我真的不能理解。我听说 perl 非常适合文本处理,所以我想学习它来自动化我所做的大部分任务。
    • @keisimone:O'Reilly 有一本书叫《Learning Perl》
    【解决方案2】:

    在 Unix 上你不能,因为文件的创建日期没有存储在文件系统中

    如果您想要一个简单的方法,您可能需要查看 stat-M(修改时间)/-Cinode 更改时间)/-A(访问时间)带有相对时间戳的表达式(多久以前)。

    【讨论】:

    • 一个好点,理解很重要,但考虑到“备份文件”的使用模式,mtime 和创建时间一样好:)
    • 还有 File::CreationTime,它存储一些带外数据,让您可以获取文件的创建时间。创建时间从 mtime 开始,但是在您更改文件后,创建时间会一直存在。 (这出奇的好。)
    【解决方案3】:

    我已经在高位和低位搜索了 unix 命令 并且找不到任何符合我需要的东西。

    查看find(1)xargs(1)。警告:这些命令可能会在 shell 提示符下改变你的生活。

    $ find /path/to/backup -type f -mtime +10 -print0 | xargs -0 echo rm -f
    

    当您确信它会随心所欲 (tm) 时,请删除 echo。它大致说,从/path/to/backup 开始,向下寻找mtime 大于1​​0 天的普通文件,并将它们的名称打印到xargs,这会将这些名称传递给rm批次。

    print0 和它的补充 -0 是 GNU 扩展——你提到你在 Linux 上——它可以让你安全地处理文件名中的空格。)

    【讨论】:

      【解决方案4】:

      您应该能够在不求助于 Unix 命令的情况下做到这一点。遍历目录中的文件,在每个文件上使用 stat 以获取文件的最后修改时间,然后在文件上使用 unlink 如果文件比您想要的旧,则将其删除。

      【讨论】:

        最近更新 更多