GNU/Linux >> Linux の 問題 >  >> Linux

そのファイル名の複数のバリエーションが同じディレクトリに一緒に存在するファイルを検索しますか?

特定のディレクトリに存在するファイルをリストしたいのですが、これらのファイルはすべて次のとおりです。

  • <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.tisAR0505.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";
    }
}

Linux
  1. ディレクトリ内のファイル数を数える最良の方法は何ですか?

  2. Debian –特定の文字列を含むホームディレクトリで過去2分間に最後に変更されたファイルを検索しますか?

  3. Linux – Linuxで現在の日付のファイルを取得しますか?

  1. コンソールで大きなファイルをチェックする方法

  2. Linux:複数のファイルのファイル拡張子を削除する

  3. ubuntuでターミナルからディレクトリを検索する方法

  1. ファイル内の複数の文字列のGrepを実行し、サイズ順にファイルを一覧表示しますか?

  2. ディレクトリ内のすべてのファイルに対してMd5sumを生成し、そのファイルのMd5sumを含む各ファイルに対して(filename).md5を書き込みますか?

  3. 検索:式の前にパスを指定する必要があります:現在のディレクトリ内のファイルも検索する再帰検索を指定するにはどうすればよいですか?