Как найти файлы / папки рекурсивно в скрипте Perl? - PullRequest
7 голосов
/ 23 февраля 2011

У меня есть Perl-скрипт, который я написал для поиска файлов, присутствующих в моих папках Windows, рекурсивно.Я ввожу текст поиска в качестве аргумента времени выполнения скрипта Perl, чтобы найти файл с этим текстом в своем имени.Сценарий perl выглядит следующим образом:

use Cwd;

$file1 = @ARGV[0];    

#@res1 = glob "*test*";
#@res1 = glob "$file1*";
@res1 = map { Cwd::abs_path($_) } glob "$file1*";
foreach (@res1)
{
    print "$_\n";
}

Но это не рекурсивный поиск во всех подкаталогах.Я знаю, glob не совпадает рекурсивно.
Поэтому попытался использовать модуль File::Find и функцию find(\&wanted, @directories);

Но я получил сообщение об ошибке find() undefined.Из того, что я прочитал из справки, я подумал, что функция find() определена по умолчанию при установке Perl, с некоторым базовым кодом для поиска папок / файлов.Разве это не правильно?

Вопросы, в приведенном выше сценарии Perl, как я могу рекурсивно искать файлы / папки?

Вторые вопросы, я обнаружил, что perldoc <module> help не имеет примеровоб использовании определенной функции в этом модуле, которая прояснит это.

Можете ли вы указать на хорошую справку / документ / книгу по использованию различных функций perl из разных модулей perl с наглядными примерами использования этих функций модуля.

Ответы [ 4 ]

15 голосов
/ 23 февраля 2011

Другой отличный модуль для использования - это File :: Find :: Rule , который скрывает некоторые сложности File :: Find , в то же время предоставляя ту же богатую функциональность.

use File::Find::Rule;
use Cwd;

my $cwd = getcwd();
my $filelist;

sub buildFileIndex {
    open ($filelist, ">", "filelist.txt") || die $!;

    # File find rule
    my $excludeDirs = File::Find::Rule->directory
                              ->name('demo', 'test', 'sample', '3rdParty') # Provide specific list of directories to *not* scan
                              ->prune          # don't go into it
                              ->discard;       # don't report it

    my $includeFiles = File::Find::Rule->file
                             ->name('*.txt', '*.csv'); # search by file extensions

    my @files = File::Find::Rule->or( $excludeDirs, $includeFiles )
                                ->in($cwd);

    print $filelist map { "$_\n" } @files;
    return \$filelist;
}
7 голосов
/ 23 февраля 2011

Эти две страницы - все, что вам нужно изучить:

4 голосов
/ 23 февраля 2011

Если вы не возражаете против использования модуля cpan, Path :: Class может сделать работу за вас:

use Path::Class;

my @files;
dir('.')->recurse(callback => sub {
    my $file = shift;
    if($file =~ /some text/) {
        push @files, $file->absolute->stringify;
    }
});

for my $file (@files) {
    # ...
}
4 голосов
/ 23 февраля 2011

Альтернативой может быть использование find2perl для создания запуска скрипта для вас. Это может превратить команду поиска как,

find . -type f -name "*test*" -print

К эквивалентному сценарию perl. Вы просто кладете find2perl вместо find. Он использует File :: Find под капотом, но быстро запускает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...