【问题标题】:How can I filter filenames based on their extension?如何根据扩展名过滤文件名?
【发布时间】:2010-10-07 20:01:59
【问题描述】:

以下脚本将所有文件和目录存储在数组@file_list中。

我如何只过滤带有.lt6 扩展名的文件,仅此而已?

opendir (CURRDIR, $localdir);
@file_list = grep !/^\.\.?$/, readdir CURRDIR;
print STDOUT "Found Files: @file_list\n";

干杯

【问题讨论】:

    标签: perl list filter


    【解决方案1】:
    my @file_list = glob "$localdir/*.lt6";
    

    【讨论】:

      【解决方案2】:

      试试这个:

      grep(/\.lt6$/i, readdir(CURRDIR))
      

      我已经用过很多次了。它可以工作,尽管现在我更喜欢使用File::Next 来处理这类事情。

      例子:

      use File::Next;
      
      my $iter = File::Next::files( { file_filter => sub { /\.lt6$/ } }, $localdir )
      
      while ( defined ( my $file = $iter->() ) ) {
          print $file, "\n";
      }
      

      【讨论】:

      • 相当相似的答案 - 不区分大小写与不区分,括号与不括号。 :D
      • 我们在一分钟内回答了对方。伟大的思想与 8D 相同。虽然在这种情况下我猜我是西部最快的枪!
      • 是的 - 我应该知道最好不要在给出答案之前编辑问题:D
      【解决方案3】:

      转到命令提示符

      光盘\

      dir /s *.lt6 > mydir.txt

      【讨论】:

        【解决方案4】:
        opendir (CURRDIR, $localdir);
        @file_list = grep m/\.lt6$/, readdir CURRDIR;
        closedir CURRDIR;
        print STDOUT "Found Files: @file_list\n";
        

        【讨论】:

        • 您无需检查 .和..如果你只通过以.lt6结尾的东西。 :)
        【解决方案5】:

        你可以使用File::Find::Rule;

        use File::Find::Rule;
        
        print "FOUND:\n    "
            , join( "\n    "
                  , File::Find::Rule->file->name( '*.lt6' )->in( $path )
                  )
            , "\n"
            ;
        

        【讨论】:

        • 这有递归下降的额外功能。如果你只想要顶级目录中的文件,这是一把强大的大枪,没有额外的好处。
        • 它只与文件列表的范围一样重,描述中未指定。它避免了程序性的开环关闭结构,而且我从来不喜欢 opendir/closedir 的单独语法,无论如何。它似乎比 sh 的 $(ls) 几乎没有改进。
        【解决方案6】:

        为了增加一点多样性,您还可以执行以下操作:

        opendir(DIR, $path) || die qq([ERROR] Cannot opendir "$path" - $!\n);
        my(@txt) = grep(m{\.txt$}, readdir DIR);
        rewinddir DIR;
        my(@lt6) = grep(m{\.lt6$}, readdir DIR);
        rewinddir DIR;
        my(@dirs) = grep(-d "$path/$_", readdir DIR);
        closedir DIR;
        

        等等。

        【讨论】:

          【解决方案7】:

          别忘了closedir()

          您的grep 应该寻找:

          my(@file_list) = grep /\.lt6$/, readdir CURRDIR;
          

          假设您的其余语法大致正确。

          【讨论】:

            猜你喜欢
            • 2012-01-23
            • 1970-01-01
            • 1970-01-01
            • 2019-05-22
            • 2016-12-03
            • 2010-10-05
            • 2022-01-06
            • 2011-12-17
            • 2010-12-31
            相关资源
            最近更新 更多