perl - 在 perl 中不进行文件比较的递归打印目录路径的优化方法
问题描述
我有一个目录,其中包含多个级别的子目录。我想为每个目录打印路径。目前,我正在使用
use File::Find;
find(
{
wanted => \&findfiles,
}, $maindirectory);
sub findfiles
{
if (-d) {
push @arrayofdirs,$File::Find::dir;
}
}
但是每个子目录在每个级别都包含数千个文件。上面的代码在比较每个文件的目录时需要花费大量时间来提供结果。有没有办法在不比较文件以节省时间或任何其他优化方法的情况下获取子目录路径?
编辑:此问题已部分解决,但由于此解决方案而出现了一个新问题。我在这里列出了它: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 本身中运行。
推荐阅读
- javascript - 禁用时间在 pickadate.js 中不起作用
- javascript - 如何在我的反应组件中使用 THREE.js(以及 THREEx 和 AR.js)CDN?
- docker - 如何使用 logrus 将日志推送到 fluentd deamonset
- reactjs - 如何在通过类名检索的 DOM 节点内呈现 React 组件?
- php - 如何在 PHP 中循环遍历对象数组
- docker - Nginx 工作进程
- edgeengine - 无法模拟智能汽车用例 - mimik
- react-native - 无法打开 DropDownPicker-React Native 的下拉菜单
- powershell - $Var.ToUpper() 抛出“您不能在空值表达式上调用方法。”
- javascript - 我怎么知道它的价值是什么会在按键上吗?