Find :: File搜索文件列表的目录

时间:2012-11-08 18:46:22

标签: perl

我正在写一个Perl脚本而且我是Perl的新手 - 我有一个包含文件列表的文件。对于列表中的每个项目,我想搜索给定目录及其子目录以查找文件返回完整路径。到目前为止,我一直试图使用File :: Find失败。这就是我得到的:

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

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list'; 
my @file_list;


find(\&wanted, $directory);

sub wanted {
    open (FILE, $input_file);

    foreach my $file (<FILE>) {
        chomp($file);

        push ( @file_list, $file );
    }   

    close (FILE);

    return @file_list;
}

3 个答案:

答案 0 :(得分:2)

我发现File :: Find :: Rule使用起来更简单,更优雅。

use File::Find::Rule;

my $path = '/some/path';
# Find all directories under $path
my @paths = File::Find::Rule->directory->in( $path );
# Find all files in $path
my @files = File::Find::Rule->file->in( $path );

数组包含对象File :: Find :: Rule的完整路径。

答案 1 :(得分:0)

File :: Find用于遍历文件系统中的目录结构。而不是做你想做的事情,即在文件中读取想要的子程序,你应该在文件中读取如下:

use strict;
use warnings;
use vars qw/@file_list/;

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list'; 
open FILE, "$input_file" or die "$!\n";
foreach my $file (<FILE>) {
    chomp($file);

    push ( @file_list, $file );
} 
# do what you need to here with the @file_list array

答案 2 :(得分:0)

好的,好好重新阅读文档,我误解了wanted子程序。 wanted是在找到的每个文件和目录上调用的子例程。所以这是考虑到这一点的我的代码

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

my $directory = '/home/directory/';
my $input_file = '/home/directory/file_list';
my @file_list;

open (FILE, $input_file);

foreach my $file (<FILE>) {
    chomp($file);

    push ( @file_list, $file );
}   

close (FILE);

find(\&wanted, $directory);

sub wanted {
    if ( $_ ~~ @file_list ) { 
        print "$File::Find::name\n";
    }   
    return;
}