how to find duplicate file name using file:find?

扶醉桌前 提交于 2020-01-06 14:16:26

问题


I am trying to write a program to find duplicate file names in multiple drive using perl. This is my script, but it gives wrong info.

#!/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 ".";
        }
    }
}

回答1:


You should always include use strict; and use warnings; in EVERY perl script. However, you lucked and that didn't lead to any errors.

In fact, other than using a regex to test when you should've used eq, your script looks functional. As a style change though, I would've saved all paths in a hash of arrays to more easily find matching files. Especially as currently your method wouldn't list groups of 3 or more together.

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";
}



回答2:


Kathir, the module File::Find::Rule is pretty powerful and easy to use. To find only mp3 files do this:

#!/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);


来源:https://stackoverflow.com/questions/23862665/how-to-find-duplicate-file-name-using-filefind

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!