Voglio elencare i file per i quali esistono, in una determinata directory, TUTTI questi file:
<filename>.wed
<filename>.tis
<filename>.are
<filename>LM.bmp
Attualmente lo sto facendo con find
e sed
. Funziona ma è poco elegante e lento!
find . -iname "*.wed" -exec echo {} \; | sed s/.wed$// $1 | sed s/..// $1 | while read in; do find . -name "$in.are"; done | sed s/.are$// $1 | sed s/..// $1 | while read in; do find . -name "$in.tis"; done | sed s/.tis$// $1 | sed s/..// $1 | while read in; do find . -name "$in*.bmp"; done
Fondamentalmente incateno un find
, due sed
e un while read
per ogni estensione su cui voglio filtrare.
Ci vogliono più di 35 secondi per appena 30.000 file! Come posso migliorarlo?
Esempio
Se nella directory sono presenti file chiamati AR0505.are
, AR0505.tis
, AR0505.wed
e AR0505LM.bmp
, lo script stamperebbe "AR0505".
Se uno o più di questi file mancavano, lo script non lo stampava.
Risposta accettata:
Penso che il principale collo di bottiglia sia il numero di processi generati. Ecco un semplice script che elenca e filtra la tua directory in un passaggio:
#!/usr/bin/perl
use strict;
use warnings;
my %files;
my $dir;
my @extensions = ("\.tis","\.are","LM\.bmp","\.wed");
opendir($dir, ".") || die "Error opening dir\n";
while (my $file = readdir($dir)) {
foreach my $ext (@extensions) {
if ($file =~ /^(.*)$ext$/sm) {
$files{$1} += 1;
}
}
}
closedir($dir);
foreach my $file (keys %files) {
if ($files{$file} == scalar(@extensions)) {
print "$file\n";
}
}