我用glob 看到了这个链接
这不是我想做的事情.
这是我的计划.为了在目录中搜索与字符串部分匹配的任何文件,将其作为参数提供给我的函数,比如说/home/username/sampledata和字符串data.
我为用户提供了一个选项,在执行时包含一个标志,强制是否检查子目录,当前默认情况下脚本不包含子目录.
包含子目录的伪代码看起来像这样.
我保存文件路径的数组是全局的
@fpaths;
foo($dir);
sub foo{
get a tmp array of all files
for ($i=0 ; $i<@tmp ; $i++) {
next if ( $tmp[$i]is a hidden file and !$hidden) ; #hidden is a flag too
if($tmp[$i] is file) {
push (@fpaths, $dir.$tmp[$i]);
}
if($tmp[$i] is dir) {
foo($dir.$tmp[$i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
看起来很稳固.
我希望实现的是保存完整路径名的每个文件的数组.
我不知道该怎么做的部分是获取每个文件的列表.希望这可以通过glob来完成.
我已经能够使用opendir/ readdir来读取每个文件,如果我知道如何检查结果是文件还是目录,我可以再次执行此操作.
所以我的问题是:
如何使用glob路径名来获取每个文件/子目录的数组
如何检查以前找到的数组上的项目是目录还是文件
谢谢大家
我会用 File::Find
请注意,这File::Find::name是给定文件的完整路径.其中包括目录,因为它们也是文件.
这只是读者弄清楚其余细节的一个示例.
use warnings;
use strict;
use File::Find;
my $path = "/home/cblack/tests";
find(\&wanted, $path);
sub wanted {
return if ! -e;
print "$File::Find::name\n" if $File::Find::name =~ /foo/;
print "$File::Find::dir\n" if $File::Find::dir =~ /foo/;
}
Run Code Online (Sandbox Code Playgroud)
更好的是,如果你想将所有这些推送到列表,你可以这样做:
use File::Find;
main();
sub main {
my $path = "/home/cblack/Misc/Tests";
my $dirs = [];
my $files= [];
my $wanted = sub { _wanted($dirs, $files) };
find($wanted, $path);
print "files: @$files\n";
print "dirs: @$dirs\n";
}
sub _wanted {
return if ! -e;
my ($dirs, $files) = @_;
push( @$files, $File::Find::name ) if $File::Find::name=~ /foo/;
push( @$dirs, $File::Find::dir ) if $File::Find::dir =~ /foo/;
}
Run Code Online (Sandbox Code Playgroud)