in reply to Removing duplicate filenames in different directories from an array

The code can probably be condensed, but this will get you what you want.
use strict; use File::Basename qw(basename); my @files = qw( /data/node12/file-29-2.txt /data/node12/file-34-2.txt /data/node12/file-50-2.txt /data/node30/file-34-2.txt /data/node30/file-60-2.txt /data/node30/file-62-2.txt /data/node34/file-29-2.txt ); my %seen = (); foreach my $file (@files) { my $bn = basename($file); if ($bn =~ /(\d+)/) { my $id = $1; if ($seen{$id}++) { print "$file needs to be deleted\n"; } } else { warn "Unexpected file found: $file\n"; } }
- Miller
  • Comment on Re: Removing duplicate filenames in different directories from an array
  • Download Code

Replies are listed 'Best First'.
Re^2: Removing duplicate filenames in different directories from an array
by AnomalousMonk (Archbishop) on Jan 30, 2011 at 23:14 UTC
    ... condensed ...
    >perl -wMstrict -le "my @filenames = qw( /data/node12/file-29-2.txt /data/node12/file-34-2.txt /data/node12/file-50-2.txt /data/node30/file-34-2.txt /data/node30/file-60-2.txt /data/node30/file-62-2.txt /data/node34/file-29-2.txt ); ;; my %seen; my @unique = grep { m{ (-\d\d-) }xms; !$seen{$1}++ } @filenames; print qq{'$_'} for @unique; " '/data/node12/file-29-2.txt' '/data/node12/file-34-2.txt' '/data/node12/file-50-2.txt' '/data/node30/file-60-2.txt' '/data/node30/file-62-2.txt'

    If the file names are in a file with one name per line, this could even be a one-liner.