gpt4 book ai didi

perl - 我将如何使用 perl 递归搜索目录和所有子目录

转载 作者:行者123 更新时间:2023-12-02 05:30:36 29 4
gpt4 key购买 nike

我看到了this link使用 glob

虽然这不是我想做的。

这是我的计划。为了在目录中搜索部分匹配字符串的任何文件,作为参数提供给我的函数,比如 /home/username/sampledata 和字符串,比如 data.

我为用户提供了在执行时包含一个标志以强制执行是否检查子目录的选项,目前默认情况下该脚本不包含子目录。

包含子目录的伪代码如下所示。

我保存文件路径的数组是全局的

  @fpaths;

foo($dir);

sub foo{
get a tmp array of all files

for ($i=0 ; $i<@tmp ; $i++) {
next if ( $tmp[$i]is a hidden file and !$hidden) ; #hidden is a flag too

if($tmp[$i] is file) {
push (@fpaths, $dir.$tmp[$i]);
}
if($tmp[$i] is dir) {
foo($dir.$tmp[$i]);
}

}
}

看起来很结实。

我希望实现的是保存完整路径名的每个文件的数组。

我不知道该怎么做的部分是获取每个文件的列表。希望这可以用 glob 来完成。

我已经能够使用 opendir/readdir 读取每个文件,如果我知道如何检查结果是文件还是目录。

所以我的问题是:

  1. 如何使用带有路径名的glob来获取每个文件/子目录的数组

  2. 如何判断之前找到的数组中的某一项是目录还是文件

谢谢大家

最佳答案

我会使用 File::Find

请注意,File::Find::name 是给定文件的完整路径。其中将包括目录,因为它们也是文件。

这只是一个示例,供读者了解其余细节。

use warnings;
use strict;
use File::Find;

my $path = "/home/cblack/tests";

find(\&wanted, $path);

sub wanted {
return if ! -e;

print "$File::Find::name\n" if $File::Find::name =~ /foo/;
print "$File::Find::dir\n" if $File::Find::dir =~ /foo/;
}

更好的是,如果你想将所有这些推送到一个列表中,你可以这样做:

use File::Find;

main();

sub main {
my $path = "/home/cblack/Misc/Tests";
my $dirs = [];
my $files= [];
my $wanted = sub { _wanted($dirs, $files) };

find($wanted, $path);
print "files: @$files\n";
print "dirs: @$dirs\n";
}

sub _wanted {
return if ! -e;
my ($dirs, $files) = @_;

push( @$files, $File::Find::name ) if $File::Find::name=~ /foo/;
push( @$dirs, $File::Find::dir ) if $File::Find::dir =~ /foo/;
}

关于perl - 我将如何使用 perl 递归搜索目录和所有子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703590/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com