【问题标题】:How do I print all .pdf files names to an output file with command line?如何使用命令行将所有 .pdf 文件名打印到输出文件?
【发布时间】:2011-05-29 18:25:09
【问题描述】:

这在 Linux 中似乎很容易,但我正在尝试将目录及其子目录中的 *.pdf 文件的名称打印到输出文件中。我在我的 Windows 机器上安装了 Perl。

有什么简单的方法可以做到这一点?

【问题讨论】:

    标签: windows perl command-line printing


    【解决方案1】:

    与 Linux 没有太大区别。

    dir *.pdf > fileyouwant.txt
    

    如果你只想要文件名,你可以这样做

    dir/b *.pdf > fileyouwant.txt
    

    如果你还想要子目录,

    dir/s/b *.pdf > fileyouwant.txt
    

    如果你不在那个目录下

    dir/s/b C:\Path\*.pdf > fileyouwant.txt
    

    【讨论】:

    • 这不会在子目录中找到文件。
    • dir 是否对子目录进行递归搜索?
    • dir /s/b 确实如此。您必须先 cd 进入目标顶级目录。
    • 不错。 dir/s/b *.pdf >fileyouwant.txt
    【解决方案2】:

    使用 Perl,您几乎肯定会使用 File::Find 核心模块。

    【讨论】:

      【解决方案3】:

      查看File::Glob 模块。

      具体来说:

      #!/usr/bin/perl
      use File::Glob ':glob'; # Override glob built-in.                          
      print join("\n",glob("*.pdf"));
      

      【讨论】:

      • @ysth:我的错,但它可能对某些人仍然有用,所以我会留下它。
      【解决方案4】:
      use strict;
      use warnings;
      use File::Find;
      
      my $dirname = shift or die "Usage: $0 dirname >outputfile";
      
      File::Find::find( sub {
          print $File::Find::name, "\n" if $File::Find::name =~ /\.pdf\z/
      }, $dirname );
      

      【讨论】:

      • 这行得通,但我可以在提示我输入目录名称后将输出打印到文件中吗?
      • @Jake:将其更改为将目录名称作为命令行参数,以便可以轻松地将输出发送到文件
      【解决方案5】:

      File::Find::Rule 通常比File::Find 更好用。

      use File::Find::Rule;
      
      my $rule = File::Find::Rule->file()->name('*.pdf')->start('C:/Path/');
      while (defined (my $pdf = $rule->match)) {
          print "$pdf\n";
      }
      

      或者干脆

      use File::Find::Rule;
      
      print "$_\n" for File::Find::Rule->file()->name('*.pdf')->in('C:/Path/');
      

      【讨论】:

        猜你喜欢
        • 2014-05-15
        • 1970-01-01
        • 2019-02-16
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        相关资源
        最近更新 更多