首页 > 解决方案 > 在 perl 中不进行文件比较的递归打印目录路径的优化方法

问题描述

我有一个目录,其中包含多个级别的子目录。我想为每个目录打印路径。目前,我正在使用

use File::Find; 

find( 
{ 
    wanted => \&findfiles, 
}, $maindirectory); 
  
sub findfiles 
{ 
      if (-d) {
     push @arrayofdirs,$File::Find::dir;
     }   
}

但是每个子目录在每个级别都包含数千个文件。上面的代码在比较每个文件的目录时需要花费大量时间来提供结果。有没有办法在不比较文件以节省时间或任何其他优化方法的情况下获取子目录路径?

编辑:此问题已部分解决,但由于此解决方案而出现了一个新问题。我在这里列出了它:Perl 中不同级别目录中的多个文件搜索

标签: perl

解决方案


如果您在 UNIX/Linux 平台上,那么您可以尝试将find $maindirectory -type d命令输出读入您的程序(请参阅此答案以获取安全的方法。)。此命令打印$maindirectory. 它更快,因为编译的 C 程序 ( find) 完成了所有艰苦的工作。以下脚本应打印找到的所有目录路径。

示例脚本:

use strict;
use warnings;

my $maindirectory = '.';
open my $fh, '-|', 'find', $maindirectory, '-type', 'd' or die "Can't open pipe: $!";
while( my $dir = <$fh>) {
    print $dir;
}
close $fh or warn "can't close pipe: $!";

find请注意,通过 perl 调用然后只打印其输出而不进行任何处理是没有意义的。您也可以find $maindirectory -type d在 shell 本身中运行。


推荐阅读