5

我有一段正在工作的代码,它可以在给定目录中找到所有 .txt 文件,但我无法让它在子目录中查找。

我需要我的脚本做两件事

  1. 扫描文件夹及其所有子目录以查找文本文件
  2. 仅打印其路径的最后一段

例如,我有一个目录结构

C:\abc\def\ghi\jkl\mnop.txt

我编写了指向路径的脚本C:\abc\def\。然后它遍历每个子文件夹并查找该文件夹中的mnop.txt任何其他文本文件。

然后打印出来ghi\jkl\mnop.txt

我正在使用它,但它实际上只打印出文件名以及文件当前是否在该目录中。

opendir(Dir, $location) or die "Failure Will Robertson!";
@reports = grep(/\.txt$/,readdir(Dir));
foreach $reports(@reports)
{
    my $files = "$location/$reports";
    open (res,$files) or die "could not open $files";
    print "$files\n";
}
4

3 回答 3

7

我相信这个解决方案更简单,更容易阅读。我希望它有帮助!

#!/usr/bin/perl

use File::Find::Rule;

my @files = File::Find::Rule->file()
                            ->name( '*.txt' )
                            ->in( '/path/to/my/folder/' );

for my $file (@files) {
    print "file: $file\n";
}
于 2015-08-20T23:43:52.940 回答
6

怎么用File::Find

#!/usr/bin/env perl

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

# for example let location be tmp
my $location="tmp";

sub find_txt {
    my $F = $File::Find::name;

    if ($F =~ /txt$/ ) {
        print "$F\n";
    }
}


find({ wanted => \&find_txt, no_chdir=>1}, $location);
于 2013-03-08T21:23:27.343 回答
2

如果您只使用File::Find核心模块会容易得多:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

use File::Find;

my $Target = shift;

find(\&survey, @ARGV);

sub survey { 
    print "Found $File::Find::name\n" if ($_ eq $Target) 
}

第一个参数:要搜索的文件的无路径名称。所有后续参数都是要检查的目录。 File::Find 递归搜索,所以你只需要命名树的顶部,所有子目录也会自动搜索。

$File::Find::name是文件的完整路径名,因此$location如果需要相对路径,可以从中减去。

于 2013-03-08T21:25:57.217 回答