我正在努力使用一种遍历目录树的方法来检查多个目录中是否存在文件。我正在使用Perl而我只能使用File::Find,因为我无法为此安装任何其他模块。
这是我想要遍历的文件系统的布局:
Cars/Honda/Civic/Setup/config.txt Cars/Honda/Pathfinder/Setup/config.txt Cars/Toyota/Corolla/Setup/config.txt Cars/Toyota/Avalon/Setup/
请注意,最后一个Setup文件夹缺少config.txt
文件。
编辑:此外,在每个安装文件夹中还有许多其他文件,从安装文件夹到安装文件夹也有所不同。确实没有任何单个文件可以搜索进入Setup文件夹本身。
因此,除了make和model文件夹之外,您可以看到文件路径保持不变。我想找到所有安装程序文件夹,然后检查该文件夹中是否有config.txt文件。
首先,我使用以下代码与File::Find
my $dir = '/test/Cars/';
find(\&find_config, $dir);
sub find_config {
# find all Setup folders from the given top level dir
if ($File::Find::dir =~ m/Setup/) {
# create the file path of config.txt whether it exists or not, well check in the next line
$config_filepath = $File::Find::dir . "/config.txt";
# check existence of file; further processing
...
}
}
您显然可以看到尝试使用$File::Find::dir =~ m/Setup/
时的缺陷,因为它会为Setup文件夹中的每个文件返回一个命中。有没有办法使用-d
或某种目录检查而不是文件检查? config.txt并不总是在文件夹中(如果它不存在我将需要创建它)所以我不能真正使用return unless ($_ =~ m/config\.txt/)
这样的东西,因为我不知道它是否存在。
我正试图找到一种方法来使用像return unless ( <is a directory> and <the directory has a regex match of m/Setup/>)
这样的东西。
对于像这样的事情来说,File::Find可能不是正确的方法,但我现在一直在寻找一段时间而没有任何好的线索来处理目录名而不是文件名。
答案 0 :(得分:4)
File :: Find也可以查找目录名称。您想检查$_ eq 'Setup'
的时间(注意:eq,而不是您的正则表达式,它也会匹配XXXSetupXXX),然后查看目录中是否有config.txt文件(-f "$File::Find::name/config.txt"
)。如果您想避免抱怨名为Setup的文件,请检查找到的'Setup'是否为-d目录。
答案 1 :(得分:0)
我正试图找到一种方法来使用像
return unless ( <is a directory> and <the directory has a regex match of m/Setup/>)
这样的东西。
use File::Spec::Functions qw( catfile );
my $dir = '/test/Cars/';
find(\&find_config, $dir);
sub find_config {
return unless $_ eq 'Setup' and -d $File::Find::name;
my $config_filepath = catfile $File::Find::name => 'config.txt';
# check for existence etc
}