Ich möchte die Dateien auflisten, für die es in einem bestimmten Verzeichnis ALLE dieser Dateien gibt:
<filename>.wed
<filename>.tis
<filename>.are
<filename>LM.bmp
Ich mache das derzeit mit find
und sed
. Es funktioniert, aber es ist unelegant und langsam!
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
Grundsätzlich verkette ich einen find
, zwei sed
und ein while read
für jede Erweiterung, nach der ich filtern möchte.
Es dauert>35 Sekunden für knapp 30.000 Dateien! Wie kann ich es verbessern?
Beispiel
Wenn sich im Verzeichnis Dateien namens AR0505.are
befinden , AR0505.tis
, AR0505.wed
und AR0505LM.bmp
, dann würde das Skript „AR0505“ ausgeben.
Wenn eine oder mehrere dieser Dateien fehlten, würde das Skript sie nicht drucken.
Akzeptierte Antwort:
Ich denke, der größte Engpass ist die Anzahl der Prozesse, die Sie erstellen. Hier ist ein einfaches Skript, das Ihr Verzeichnis in einem Durchgang auflistet und filtert:
#!/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";
}
}