我需要删除名为“存档”的目录中早于 X 天的所有文件。有多个名为“archive”的目录位于目录树的不同深度。
我的问题是使用什么工具来查找目录?我的第一个冲动是使用 PerlFile:Find
模块,但过去我很尴尬地发现一个 shell 脚本单行来做我为之编写多行 Perl 脚本的同样的事情。
也许这对你有用:
# 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
我建议使用该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;
}
});
这将适用于 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
为什么要经历所有这些繁琐的事情?因为您要确保删除的是要删除的内容,而不是要保留的内容。如果您要删除内容,最好采取一些额外的步骤并确保一切正常。