特定のディレクトリに存在するファイルをリストしたいのですが、これらのファイルはすべて次のとおりです。
-
<filename>.wed
-
<filename>.tis
-
<filename>.are
-
<filename>LM.bmp
私は現在find
でそれを行っています およびsed
。動作しますが、エレガントではなく遅いです!
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
基本的に私はfind
を連鎖させます 、2つのsed
およびwhile read
フィルタリングしたい拡張機能ごとに。
わずか30Kのファイルの場合は35秒以上かかります。どうすれば改善できますか?
例
ディレクトリにAR0505.are
というファイルがある場合 、AR0505.tis
、AR0505.wed
およびAR0505LM.bmp
、その後、スクリプトは「AR0505」を出力します。
これらのファイルの1つ以上が欠落している場合、スクリプトはそれを印刷しません。
承認された回答:
主なボトルネックは、スポーンするプロセスの数だと思います。これは、ディレクトリを1回のパスで一覧表示およびフィルタリングする簡単なスクリプトです。
#!/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";
}
}