5

指定されたディレクトリ内のすべての .txt ファイルを検索するコードのセグメントが動作していますが、サブディレクトリを調べることができません。

スクリプトで 2 つのことを行う必要があります

  1. フォルダとそのすべてのサブディレクトリをスキャンしてテキスト ファイルを探す
  2. そのパスの最後のセグメントだけを出力します

たとえば、構造化されたディレクトリがあります

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

path を指すスクリプトを作成します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 に答える