如何使用file找到重复的文件名:find?

时间:2014-05-26 04:22:53

标签: perl perl-module

我正在尝试编写一个程序,使用perl在多个驱动器中查找重复的文件名。这是我的脚本,但它提供了错误的信息。

#!/usr/bin/perl
use File::Find;
@filename;
@path;
$count;
open my $out, '>', 'output.txt' or die $!;
my $file = "E:";
find( \&edit, "$file" );

sub edit() {
    $count++;
    push( @filename, $_ );
    push( @path,     $File::Find::name );
}
print "Processing.";
for ( my $i = 0 ; $i < $count ; $i++ ) {
    for ( my $j = $i + 1 ; $j < $count ; $j++ ) {
        if ( $filename[$i] =~ /\Q$filename[$j]\E/ ) {
            print $out("$filename[$i] = $filename[$j]\n");
            print ".";
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您应始终在每个perl脚本中包含use strict;use warnings;。但是,你很幸运,并没有导致任何错误。

事实上,除了使用正则表达式来测试何时应该使用eq,您的脚本看起来很有用。虽然样式更改,但我会在数组散列中保存所有路径,以便更轻松地找到匹配的文件。特别是目前你的方法不会将3个或更多的组一起列出。

use strict;
use warnings;
use autodie;

use File::Find;

my %files;

open my $out, '>', 'output.txt';
my $file = "E:";

find( \&edit, "$file" );

sub edit() {
    push @{$files{$_}}, $File::Find::name;
}

while (my ($file, $paths) = each %files) {
    next if @$paths == 1;
    print "$file @$paths\n";
}

答案 1 :(得分:0)

Kathir,模块File :: Find :: Rule非常强大且易于使用。要查找只有mp3文件,请执行以下操作:

#!/usr/bin/perl
use strict;
use warnings;
use File::Find::Rule;

my $directory_to_look_in = '/tmp/you/know';
my @files = File::Find::Rule->file()->name('*.mp3')->in($directory_to_look_in);