我想列出给定目录中存在的所有这些文件:
<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
,对于要过滤的每个扩展,我都将a ,2sed
和a链接在一起while read
。
几乎不到30K的文件需要> 35s!我该如何改善?
如果目录下有文件叫AR0505.are
,AR0505.tis
,AR0505.wed
和AR0505LM.bmp
,那么该脚本将打印“AR0505”。
如果缺少这些文件中的一个或多个,则脚本将不会打印该文件。
我认为主要的瓶颈是您产生的进程数。这是一个简单的脚本,可一次性列出和过滤目录:
#!/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";
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句