0

これが私のディレクトリ構造です..

                                    Current
                   /                    |                       \
           a                            d                       g
        /      \                   /             \              | 
        b       c                e              morning         evenin
       /  \    /   \             |
     hello hi  bad good          f
                                 /  \   
                               good night

current、a、b、c、d、e、f、g はディレクトリ、その他はファイルです。ここで、現在のディレクトリの g フォルダーだけで検索を実行しないように、現在のフォルダーを再帰的に検索したいと考えています。さらに、'good' ファイルは current-ac-good と current-def-good で同じであるため、その内容は 1 回だけ記載する必要があります。やり方を教えてください。

4

2 に答える 2

1

コメントでのPaulchenkillerの提案は問題ありません。モジュールはFile::Find再帰的に検索し、トラバース中にファイルとディレクトリをどうするかを簡単に処理できるようにします。ここに、探しているものに似たものがあります。オプションを使用preprocessしてディレクトリを整理し、オプションを使用wantedしてすべてのファイル名を取得します。

#!/usr/bin/env perl

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

my (%processed_files);

find( { wanted => \&wanted,
        preprocess => \&dir_preprocess,
      }, '.',
);

for ( keys %processed_files ) { 
        printf qq|%s\n|, $_;
}

sub dir_preprocess {
        my (@entries) = @_; 
        if ( $File::Find::dir eq '.' ) { 
                @entries = grep { ! ( -d && $_ eq 'g' ) } @entries;
        }   
        return @entries;
}

sub wanted {
        if ( -f && ! -l && ! defined $processed_files{ $_ } ) { 
                $processed_files{ $_ } = 1;
        }   
}
于 2013-07-25T07:10:17.240 に答える
0
my $path = "/some/path";
my $filenames = {};

recursive( $path );

print join( "\n", keys %$filenames );

sub recursive
{
    my $p = shift;
    my $d;

    opendir $d, $p;

    while( readdir $d )
    {
        next if /^\./; # this will skip '.' and '..' (but also '.blabla')

        # check it is dir
        if( -d "$p/$_" )
        {
            recursive( "$p/$_" );
        }
        else
        {
            $filenames->{ $_ } = 1;
        }
    }

    closedir $d;
}
于 2013-07-25T06:44:00.773 に答える