1

我正在编写一个 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;
}
4

3 回答 3

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 找到的对象的完整路径。

于 2012-11-08T21:11:15.980 回答
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
于 2012-11-08T18:54:06.873 回答
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;
}
于 2012-11-08T19:52:14.263 回答