我要求删除早于X天的名为“archive”的目录中的所有文件。名为“archive”的多个目录位于目录树的不同深度。
我的问题是用什么工具来查找目录?我的第一个冲动是使用Perl File:Find
模块,但我过去一直很尴尬地找到一个shell脚本单行代码来执行我为多行Perl脚本编写的相同内容。
答案 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
为什么要经历所有这些严峻考验?因为您要确保删除要删除的内容而不是要删除的内容。如果你要删除东西,最好采取一些额外的步骤并确保一切正常。