0

我需要删除名为“存档”的目录中早于 X 天的所有文件。有多个名为“archive”的目录位于目录树的不同深度。

我的问题是使用什么工具来查找目录?我的第一个冲动是使用 PerlFile:Find模块,但过去我很尴尬地发现一个 shell 脚本单行来做我为之编写多行 Perl 脚本的同样的事情。

4

3 回答 3

3

也许这对你有用:

# Delete one at a time.
find /path/to/your/files* -type f -mtime +10 -exec rm {} \;

# Use one rm for multiple dirs. (GNU find)
find /path/to/your/files* -type f -mtime +10 -exec rm {} +

# Use one rm for multiple dirs. (Any find)
find /path/to/your/files* -type f -mtime +10 -print0 | xargs -0 rm

在这种情况下,它将从您的路径中删除所有超过 10 天的文件。小心使用它。:-)

如果您只想删除文件夹存档中的文件,则应添加

-ipath '*/archive/*'

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 -exec rm {} \;

也许您应该通过将找到的文件写入文本文件来测试整个场景,以确保它是正确的。

find /path/to/your/files* -ipath '*/archive/*' -type f -mtime +10 > filelist.txt
于 2012-06-05T15:28:34.880 回答
0

我建议使用该Path::Class模块,它的traverse方法与File::Find工作方式相似,但更方便。

该程序将搜索给定的目录树,并查找位于名为的文件夹中archive且修改时间为三天或更早的所有文件。

就目前而言,该程序将简单地打印它找到的符合条件的文件。要实际删除它们,您应该#从包含$node->remove.

use strict;
use warnings;

use Path::Class;

my $dir = dir '/path/to/root';

$dir->traverse(sub {
  my ($node, $cont) = @_;
  if ($node->is_dir) {
    $cont->();
  }
  elsif ($node->dir->basename eq 'archive') {
    my $age = (time - $node->stat->mtime) / (60 * 60 * 24);
    printf "%s %.1f days old\n", $node, $age;
    # $node->remove if $age > 3;
  }
});
于 2012-06-05T16:04:58.103 回答
0

这将适用于 Linux 和 Mac:

$ find . -name archive -type d -mtime -$X_DAYS -delete

但是,我的偏好是首先运行它:

$ find . -name archive -type d -mtime -$X_DAYS -ls | tee find.out

这将列出您要删除的文件并将它们放在一个名为find.out. 您可以查看输出并确保其中没有任何会导致任何问题的内容。也许有一个超过 10 天的存档目录,但您不想删除它。

您可以编辑此文件以删除您想要保留的任何内容。然后您可以运行以下命令:

$ awk '{print "rm -rf " $NF}' find.out | tee command.out

这将创建一个命令文件以删除目录。看一下command.out,如果一切正常,请执行以下操作:

$ sh 命令.out

为什么要经历所有这些繁琐的事情?因为您要确保删除的是要删除的内容,而不是要保留的内容。如果您要删除内容,最好采取一些额外的步骤并确保一切正常。

于 2012-06-05T17:36:00.290 回答