【发布时间】:2011-02-03 19:22:43
【问题描述】:
我需要删除给定文件夹下的所有内容(文件和文件夹)。问题是该文件夹中有数百万个文件和文件夹。所以我不想一次性加载所有文件名。
逻辑应该是这样的:
- 迭代文件夹而不加载所有内容
- 获取文件或文件夹
- 删除它 (详细说明文件或文件夹“X”已被删除)
- 转到下一个
我正在尝试这样的事情:
sub main(){
my ($rc, $help, $debug, $root) = ();
$rc = GetOptions ( "HELP" => \$help,
"DEBUG" => \$debug,
"ROOT=s" => \$root);
die "Bad command line options\n$usage\n" unless ($rc);
if ($help) { print $usage; exit (0); }
if ($debug) {
warn "\nProceeding to execution with following parameters: \n";
warn "===============================================================\n";
warn "ROOT = $root\n";
} # write debug information to STDERR
print "\n Starting to delete...\n";
die "usage: $0 dir ..\n" unless $root;
*name = *File::Find::name;
find \&verbose, @ARGV;
}
sub verbose {
if (!-l && -d _) {
print "rmdir $name\n";
} else {
print "unlink $name\n";
}
}
main();
它工作正常,但是每当“find”读取巨大的文件夹时,应用程序就会卡住,我可以看到 Perl 的系统内存增加直到超时。为什么?它是否试图一次性加载所有文件?
感谢您的帮助。
【问题讨论】:
-
问题只有当你把它变成问题时才是问题。为什么要写
rm或rd /q/s(取决于你的操作系统)? -
我不同意使用 rm 或 rd 一定更好。使用 perl 内置函数更便携。
-
我需要逐个文件删除并详细说明,可以吗?我在 Windows S.O.和 rmdir 只是卡住了。我想详细说明这个过程。
-
rmdir 可能没有卡住,只是在删除数百万个文件。 “冗长”这个过程会使其花费更长的时间,而数百万行的输出真的对你有帮助吗?
-
看我的帖子,你需要
finddepth而不是find。在选项中指定no_chdir => 1比使用*name = *File::Find::name;更好。另外,您忘记在sub verbose中跳过.和..。
标签: perl file-handling