約1500のファイル名で検索を行う必要があり、同時に検索コマンドを実行する方法があるかどうか疑問に思いました。
今、私は次のようなことをします
for fil in $(cat my_file)
do
find . -name $fil >> outputfile
done
プロセスをスピードアップするためにfindの複数のインスタンスを生成する方法はありますか?現在、このループを一度に1つのファイルで実行するには、約7時間かかります。
多分何かのような
find . \( -name file1 -o -name file2 -o ... \) >outputfile
次の名前の数に応じて、この種の行を作成できますmy_file
。
find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
あなたが言及した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秒未満かかります。updatedb
1500個のファイル名を見つけるジョブを開始する直前に実行することをお勧めします。を参照してくださいman updatedb
。のディレクトリ.
がfind
ファイルシステム全体のごく一部であり、locate
データベースに無関係なファイルが多数含まれている場合は、prune
実行時にさまざまなオプションを使用して、実行時にアクセスされるデータベースupdatedb
のサイズを最小限に抑えます。その後、プレーンを実行して他のファイル名をデータベースに復元します。使用するlocate
locate
updatedb
locate
locate
おそらく実行時間を20分に短縮できます。
このソリューションはfind
、fgrep
1回だけ呼び出します。
find . | fgrep -f my_file > outputfile
探しmy_file
ているファイルのリストがあり、それぞれの名前が別々の行にあると思います。
find
コマンドは、現在のディレクトリ内のすべてのファイル(ディレクトリを含む)を検索します。その出力は、ファイル/ディレクトリのリストで、1行に1つずつです。fgrep
出力から検索しますが、コマンドラインで検索語を指定する代わりに、-から検索語を取得します。my_file
これが-f
フラグの目的です。outputfile
プロセスをスピードアップするためにfindの複数のインスタンスを生成する方法はありますか?
find
I / OとFSが制限されているため、これは問題を解決したい方法ではありません。
1つのコマンドを使用して一度に複数のファイル名を検索するために、-name
一緒にグループ化された複数の引数を使用するか、すべてのファイルを1回検索して、ファイルの結果リストで目的のファイル名を検索するなどのツールを使用します。-o
find
grep