3

約1500のファイル名で検索を行う必要があり、同時に検索コマンドを実行する方法があるかどうか疑問に思いました。

今、私は次のようなことをします

for fil in $(cat my_file)
do
  find . -name $fil >> outputfile
done

プロセスをスピードアップするためにfindの複数のインスタンスを生成する方法はありますか?現在、このループを一度に1つのファイルで実行するには、約7時間かかります。

4

4 に答える 4

2

多分何かのような

find . \( -name file1 -o -name file2 -o ... \) >outputfile

次の名前の数に応じて、この種の行を作成できますmy_file

find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
于 2012-10-25T17:18:33.140 に答える
2

あなたが言及した7時間の実行時間を考えると、ファイルシステムには数百万のファイルが含まれていると思います。そのため、あるクエリでロードされたOSディスクバッファは、次のクエリが開始する前に再利用されます。find次の例のように、同じタイミングを数回行うことで、この仮説をテストできます。

tini ~ > time find . -name IMG_0772.JPG -ls
25430459 9504 lrwxrwxrwx   1 omg omg  9732338 Aug  1 01:33 ./pix/rainbow/IMG_0772.JPG
20341373 5024 -rwxr-xr-x   1 omg omg  5144339 Apr 22  2009 ./pc/2009-04/IMG_0772.JPG
22678808 2848 -rwxr-xr-x   1 omg omg  2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG

real    0m15.823s
user    0m0.908s
sys 0m1.608s

tini ~ > time find . -name IMG_0772.JPG -ls
25430459 9504 lrwxrwxrwx   1 omg omg  9732338 Aug  1 01:33 ./pix/rainbow/IMG_0772.JPG
20341373 5024 -rwxr-xr-x   1 omg omg  5144339 Apr 22  2009 ./pc/2009-04/IMG_0772.JPG
22678808 2848 -rwxr-xr-x   1 omg omg  2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG

real    0m0.715s
user    0m0.340s
sys 0m0.368s

この例ではfind、OSのRAMに最初のからのバッファがまだあるため、2番目の実行ははるかに高速 findでした。[私の小さなLinux3.2.0-32システムtopでは、現時点では2.5GBのRAMがバッファーであり、0.3GBが無料で、3.8GBが使用されています(つまり、プログラムとOSの場合は約1.3GB)。]

とにかく、処理を高速化するには、OSディスクバッファリングをより有効に活用する方法を見つける必要があります。たとえば、システムメモリを2倍または4倍にします。別の方法として、コマンドを試してくださいlocate。私のシステムでは、クエリ
time locate IMG_0772.JPG
は一貫して1秒未満かかります。updatedb1500個のファイル名を見つけるジョブを開始する直前に実行することをお勧めします。を参照してくださいman updatedb。のディレクトリ.findファイルシステム全体のごく一部であり、locateデータベースに無関係なファイルが多数含まれている場合は、prune実行時にさまざまなオプションを使用して、実行時にアクセスされるデータベースupdatedbのサイズを最小限に抑えます。その後、プレーンを実行して他のファイル名をデータベースに復元します。使用するlocatelocateupdatedblocatelocateおそらく実行時間を20分に短縮できます。

于 2012-10-25T18:18:46.383 に答える
2

このソリューションはfindfgrep1回だけ呼び出します。

find . | fgrep -f my_file > outputfile

探しmy_fileているファイルのリストがあり、それぞれの名前が別々の行にあると思います。

説明

  1. このfindコマンドは、現在のディレクトリ内のすべてのファイル(ディレクトリを含む)を検索します。その出力は、ファイル/ディレクトリのリストで、1行に1つずつです。
  2. コマンドはfindコマンドのfgrep出力から検索しますが、コマンドラインで検索語を指定する代わりに、-から検索語を取得します。my_fileこれが-fフラグの目的です。
  3. 探しているファイルのリストであるfgrepコマンドの出力は、にリダイレクトされます。outputfile
于 2012-10-25T18:43:06.863 に答える
1

プロセスをスピードアップするためにfindの複数のインスタンスを生成する方法はありますか?

findI / OとFSが制限されているため、これは問題を解決したい方法ではありません。

1つのコマンドを使用して一度に複数のファイル名を検索するために、-name一緒にグループ化された複数の引数を使用するか、すべてのファイルを1回検索して、ファイルの結果リストで目的のファイル名を検索するなどのツールを使用します。-ofindgrep

于 2012-10-25T17:16:32.420 に答える