Quiero enumerar los archivos para los que existen, en un directorio dado, TODOS estos archivos:
<filename>.wed
<filename>.tis
<filename>.are
<filename>LM.bmp
Actualmente lo estoy haciendo con find
y sed
. ¡Funciona pero es poco elegante y 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
Básicamente encadeno un find
, dos sed
y un while read
para cada extensión por la que quiero filtrar.
¡Toma>35s para archivos de apenas 30K! ¿Cómo puedo mejorarlo?
Ejemplo
Si en el directorio hay archivos llamados AR0505.are
, AR0505.tis
, AR0505.wed
y AR0505LM.bmp
, entonces el script imprimiría "AR0505".
Si falta uno o más de estos archivos, el script no los imprimirá.
Respuesta aceptada:
Creo que el principal cuello de botella es la cantidad de procesos que genera. Aquí hay una secuencia de comandos simple que enumera y filtra su directorio en una sola pasada:
#!/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";
}
}