我如何使用perl以递归方式搜索目录和所有子目录

Chr*_*her 2 perl glob

我用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来读取每个文件,如果我知道如何检查结果是文件还是目录,我可以再次执行此操作.

所以我的问题是:

  1. 如何使用glob路径名来获取每个文件/子目录的数组

  2. 如何检查以前找到的数组上的项目是目录还是文件

谢谢大家

chr*_*lck 9

我会用 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)