【问题标题】:How can I list all of the files in a directory with Perl? [duplicate]如何使用 Perl 列出目录中的所有文件? [复制]
【发布时间】:2023-03-28 04:17:01
【问题描述】:

Perl 中有一个函数可以列出目录中的所有文件和目录吗? 我记得Java有File.list()来做这个? Perl 中有类似的方法吗?

【问题讨论】:

    标签: perl directory


    【解决方案1】:

    如果你想获取给定目录的内容,并且只有它(即没有子目录),最好的方法是使用 opendir/readdir/closedir:

    opendir my $dir, "/some/path" or die "Cannot open directory: $!";
    my @files = readdir $dir;
    closedir $dir;
    

    你也可以使用:

    my @files = glob( $dir . '/*' );
    

    但在我看来它不是那么好 - 主要是因为 glob 是相当复杂的东西(可以自动过滤结果)并且使用它来获取目录的所有元素似乎是一项过于简单的任务。

    另一方面,如果你需要从所有目录和子目录中获取内容,基本上有一个标准的解决方案:

    use File::Find;
    
    my @content;
    find( \&wanted, '/some/path');
    do_something_with( @content );
    
    exit;
    
    sub wanted {
      push @content, $File::Find::name;
      return;
    }
    

    【讨论】:

    • 我总是忘记 readdir 只是返回一个相对文件名的列表,而不是整个路径!
    • 感谢您不鼓励在此任务中使用通配符。使用 globbing 的另一个缺点是,它不会找到隐藏文件(以点开头的文件)。
    【解决方案2】:

    readdir() 会这样做。

    查看http://perldoc.perl.org/functions/readdir.html

    opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
    @dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
    closedir DIR;
    

    【讨论】:

      【解决方案3】:

      应该这样做。

      my $dir = "bla/bla/upload";
      opendir DIR,$dir;
      my @dir = readdir(DIR);
      close DIR;
      foreach(@dir){
          if (-f $dir . "/" . $_ ){
              print $_,"   : file\n";
          }elsif(-d $dir . "/" . $_){
              print $_,"   : folder\n";
          }else{
              print $_,"   : other\n";
          }
      }
      

      【讨论】:

      • 您应该检查 opendir 是否失败(opendir...或死“错误消息:$!”)。另外,我错过了什么吗? Win32::GUI::DoEvents() 在这里做什么? (我没有看到任何相关的问题。)
      • 这是我不想或希望记住常规表达式的最好方法,因为它应该很容易做到,我将使用它来创建一个函数,如 list($dir,"f");用于目录的文件“d”,感谢您发布此内容
      【解决方案4】:

      File::Find

      use File::Find;
      finddepth(\&wanted, '/some/path/to/dir');
      sub wanted { print };
      

      如果存在子目录,它将通过子目录。

      【讨论】:

        【解决方案5】:

        如果你像我一样懒惰,你可能会喜欢使用File::Slurp 模块。 read_dir 函数会将目录内容读入一个数组,删除点,如果需要的话,为返回的文件加上绝对路径的 dir 前缀

        my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
        

        【讨论】:

          【解决方案6】:

          这将按顺序和属性列出您指定的目录中的所有内容(包括子目录)。我花了几天的时间寻找可以做这件事的东西,我参与了整个讨论的一部分,还有一点我自己的,然后把它们放在一起。尽情享受吧!

          #!/usr/bin/perl --
          print qq~Content-type: text/html\n\n~;
          print qq~<font face="arial" size="2">~;
          
          use File::Find;
          
          # find( \&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line
          find( \&wanted_tom, '/home');
          exit;
          
          sub wanted_tom {
          ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
          $mode = (stat($_))[2];
          $mode = substr(sprintf("%03lo", $mode), -3);
          
          if (-d $File::Find::name) {
          print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
           } else {
          print "$File::Find::name --ATTR:$mode<br>";
           }
            return;
          }
          

          【讨论】:

          • ...每个 perl 程序员都说过
          猜你喜欢
          • 2011-04-15
          • 2012-12-23
          • 1970-01-01
          • 2011-03-13
          • 2014-03-08
          • 2016-07-05
          相关资源
          最近更新 更多