查找名为“archive”的目录并删除文件

时间:2012-06-05 15:24:04

标签: perl shell sysadmin

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

我的问题是用什么工具来查找目录?我的第一个冲动是使用Perl File:Find模块,但我过去一直很尴尬地找到一个shell脚本单行代码来执行我为多行Perl脚本编写的相同内容。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
  }
});

答案 2 :(得分: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 command.out

为什么要经历所有这些严峻考验?因为您要确保删除要删除的内容而不是要删除的内容。如果你要删除东西,最好采取一些额外的步骤并确保一切正常。