我有一个脚本,它会弹出特定目录下相应文件的文件名和上次修改时间。我使用DosGlob模块来指定正则表达式。
示例目录结构是:
//share16/ABC/X/Output/1/
//share16/ABC/X/Output/2/
//share16/ABC/Y/Output/1/
//share16/ABC/Y/Output/2/
以下是执行上述操作的代码,此后还有其他代码,不在目前的上下文中。
use File::DosGlob 'glob';
my @dir_regex = glob "//share16/ABC/*/Output/";
for my $dir (@dir_regex) {
find( { wanted => \&process_file, no_chdir => 1 }, $dir ) or die $!;
}
sub process_file {
my $dummy = $_;
if ( -f $dummy ) {
my $filename = "//share16/TOOLS/report.txt";
open( my $fh, '>>', $filename )
or die "Could not open file '$filename' $!";
my $last_mod_time = ctime( stat($dummy)->mtime );
print $fh "$last_mod_time $dummy\n";
}
close $fh;
}
脚本成功列出了第一个目录X下所有文件夹(文件夹1,文件夹2)下的文件,但在开始读取文件夹Y时立即失败。
错误:\ share16 \ traverse4.pl第5行没有此类文件或目录。
我无法理解它失败的原因,因为我尝试在dir_regex中对foldername进行硬编码,但在列出第一个目录下的文件后仍然失败。
答案 0 :(得分:2)
因为您设置no_chdir
所以find
不会chdir
。因此,您的各种调用 - 具有相对路径 - 失败。简单的解决方案是使用$File::Find::name
而不是$_
我还要注意 - 您只需指定File::Find
的目录列表 - 您不需要单独执行每个目录列表。