2012-04-11 13 views
3

私は、サーバ上の何百万ものファイルを調べ、与えられた接尾辞でいくつかを見つける必要のある単純なfindコマンドを持っています。ファイルは頻繁に書き込まれ、削除されます。もっと速く見つける方法があるのだろうかと思うだけです。ロケートの使用は非常に高価になるため、ロケートの使用は問題になりません。fast shell find

find /myDirWithThausandsofDirectories/ -name *.suffix 

一部のサーバーでは、このコマンドに数日かかることがあります。

どのような考えですか?

おかげで、

+0

あなたができることすべてについてです。 findはディレクトリを繰り返し処理しますが、unixシステム上の 'large'ディレクトリを通過するのは、ディレクトリエントリがどのように格納されるかによって自然に遅くなります。 –

+0

問題を解決しますか? 'find /myDirWith../dira* -name * .suf&find /myDirWith../dirb* -name * .suf ....&'また、 'gnu-parallel'または' xargs -n'を見てください。良い運! – shellter

+1

おそらく、何百万ものファイルとは異なるものがあると良いケースです。 GDBMデータベース、またはMySQLやPostGresQLのような "リレーショナル"データベース、またはmangodbのようなnoSQLのものです。 –

答えて

2

あなたは、ファイルの作成と削除を監視するために、監査サブシステムを使用することができます。これを最初の実行であるfindと組み合わせると、リアルタイムで更新できるファイルのデータベースを作成できるようになります。

3

分裂と征服? MP osとプロセッサーを仮定すると、 は各サブフォルダーに対して複数のfindコマンドを生成します。

for dir in /myDirWithThausandsofDirectories/* 
do find "$dir" -name "*.suffix" & 
done 

指定した時刻に実行どのように多くのプロセス(findコマンド)を制御することもできますサブディレクトリの数に応じました。これはちょっと難解ですが、実行可能です(つまり、bashシェルを使用して、生成されたプロセスのpidを持つ配列を保持し、配列の長さに応じて新しいもののみを許可します)。 また、上の例では、ルートディレクトリの下にあるファイルは検索しません。そのアイデアの簡単な例です。

管理方法の処理方法がわからない場合は、学習する時間が必要です。 Thisは、件名では本当に良いテキストです。 Thisは実際に必要なものです。しかし、それがどのように機能するかを理解するために全部を読んでください。

+0

あなたは 'nice'や' ionice'のようなものを見てスクリプトに優先順位をつけることもできますが、大きな違いがあるかどうかは分かりません。 – c00kiemon5ter

+0

私はプロセスの数を制御する方法を知らない! – Amir

+1

私は助けに私の答えを編集:) – c00kiemon5ter

0

単純なグロブを使用しているので、Bashの再帰的グロブを使用できる可能性があります。例:それはfindよりもはるかに少ないの柔軟性を備えた内部シェルの機能を使用していますので、

shopt -s globstar 
for path in /etc/**/**.conf 
do 
    echo "$path" 
done 

は、速くなるかもしれません。

あなたがバッシュを使用できない場合がありますが、パスの深さに制限があり、明示的に異なる深さを一覧表示することができます:ここでは

for path in /etc/*/*.conf /etc/*/*/*.conf /etc/*/*/*/*.conf 
do 
    echo "$path" 
done 
0

はコードです:

find /myDirWithThausandsofDirectories/ -d type maxdepth 1 > /tmp/input 
IFS=$'\n' read -r -d '' -a files < /tmp/input 


do_it() { 
    for f; do find $f -name *.suffix | sed -e s/\.suffix//g ; done 
} 

# Divide the list into 5 sub-lists. 
i=0 n=0 a=() b=() c=() d=() e=() 
while ((i < ${#files[*]})); do 
    a[n]=${files[i]} 
    b[n]=${files[i+1]} 
    c[n]=${files[i+2]} 
    d[n]=${files[i+3]} 
    e[n]=${files[i+4]} 
    ((i+=5, n++)) 
done 

# Process the sub-lists in parallel 
do_it "${a[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${b[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${c[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${d[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${e[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
wait 
echo Find is Done! 

私がこれを持っている唯一の問題は、ファイル名の一部(非常に小さなパーセンテージ)が部分的に出ていることです。私は理由は何でしょうか分かりません!