2009-07-06 4 views
27

時々私はファイルが深くないことを知っていますが、非常に密度の高いサブディレクトリでは、私が簡単に望むファイルを見つけることができません。breadth-firstファイルを 'find'または他のツールで検索できますか?

find(または他のツール)は、幅優先検索を使用してファイルを検索できますか?

+1

まだこのようなことを探している場合は、[this](https://github.com/tavianator/bfs)と書いてください。 –

+0

** find **コマンドの "prune"オプションをマスターしている間あなたはそれにいます。探しているオブジェクト - ファイルまたはディレクトリ - を知っているときに、深く根づいていて、人口密度の高いディレクトリサブツリーの深さ優先の再帰的な検索に没頭するのは意味がありません。 –

答えて

16

ありがとうございます。

オプションを使用すると、ディレクトリ自体の前にディレクトリの内容を処理することができます。 -maxdepthオプションを使用して、ドリルダウンするディレクトリの数を制限することもできます。

+2

"sort of"は正しい - a/b/cはa/dの前に訪れるので、これは実際の幅優先検索ではありません。しかし、ほとんどの目的には十分です。 – ephemient

+1

これはまだ幅広い最初の検索ではありません。これは深さの最初の検索では限られています。限られた深さの最初の検索では、「それほど深くないファイル」を見つける問題を解決しますが、これは間違いなく幅広い最初の検索ではありません。 – yiati

4

find--maxdepthオプションで使用してください。

参考ページのDirectoriesセクションにあります。あなたのニーズに応じて、他のオプションがより適しているかもしれません。

最初の検索を正確に行うには、--mindepth--maxdepthのオプションを組み合わせてループする必要があります。しかし、私はそれが正確である必要はないと思う、深さの限られた検索は通常十分である。

7

恐ろしいハックは、...などなど、非効率的、-0または-print以外の任意のアクションを

#!/bin/bash 
i=0 
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do 
    echo "$results" 
    ((i++)) 
done 

を動作しません基本的にこれはちょうど

find -mindepth 0 -maxdepth 0 
find -mindepth 1 -maxdepth 1 
find -mindepth 2 -maxdepth 2 
………………………………………………………………………… 

findまで戻り、ゼロ以外を実行しますステータスを表示するか、何も印刷しません。

+3

[反復深さ優先検索](http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search)のように見えます... –

+1

@MattLuongo:あなたのリンクから: "IDDFSは幅優先検索と同じですが、メモリははるかに少ない; " –

+1

@MooingDuck私はそれが特定の名前を持っていることを指摘して、これがうまくいかないとは反対していませんでした。 IDFSはまた、毎回ツリー上の以前のレベルを再トラバースする必要があるため、BFSよりも遅い。私が聞いた議論は、ほとんどの検索問題ではランタイムコストは 'n + 1 'をトラバースするコストに支配されているので、それはしばしば価値があります。 –

5

変数をキューとして使用する、幅優先検索。

それが実行可能にbfs.sh

#!/bin/bash 

queue="$1" 
shift 

while [ -n "$queue" ] 
do 
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $* 
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d` 
done 

を作成します。

$ chmod u+x ./bfs.sh

次にあなたがで幅優先検索を行うことができます。

$ ./bfs.sh /path/to/somewhere -name foobar

0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n | awk '{print $2}' | xargs grep -d skip "search term" 

findを使用してすべてのファイルを一覧表示します。最初のawkコマンドはすべての '/'文字をカウントします。それはカウントでソートし、カウントの列をドロップします。最後に、ファイルのソートされたリストをgrepするためにxargsを使用します。

これは本当に醜いです。

関連する問題