Je souhaite lister les fichiers pour lesquels il existe, dans un répertoire donné, TOUS ces fichiers :
<filename>.wed
<filename>.tis
<filename>.are
<filename>LM.bmp
Je le fais actuellement avec find
et sed
. Ça marche mais c'est inélégant et lent !
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
En gros j'enchaine un find
, deux sed
et un while read
pour chaque extension sur laquelle je souhaite filtrer.
Cela prend plus de 35 s pour à peine 30 000 fichiers ! Comment puis-je l'améliorer ?
Exemple
Si dans le répertoire il y a des fichiers nommés AR0505.are
, AR0505.tis
, AR0505.wed
et AR0505LM.bmp
, le script affichera "AR0505".
Si un ou plusieurs de ces fichiers manquaient, le script ne l'imprimerait pas.
Réponse acceptée :
Je pense que le principal goulot d'étranglement est le nombre de processus que vous générez. Voici un script simple qui liste et filtre votre répertoire en un seul passage :
#!/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";
}
}