2013-03-01 26 views
5

grepには、-rオプションを使用して再帰的に検索する機能があります。しかし、grepが指定された数のサブフォルダレベルに対してクエリ文字列を再帰的に検索できるかどうかは疑問でした。例えば、私はrootというフォルダを持ち、それにはparent1, parent2, ..., parentNというフォルダがあります。各親フォルダには、通常のテキストファイルとchild1, child2, ..., childMというフォルダがあります。私はルートレベルからgrepを実行し、子フォルダを調べずに親の中のファイルを検索したいと思います。これを行う簡単な方法はありますか?grepを再帰的に使用する

grepの

+1

find/path/to/find -name "nameofthefile"または各ファイルをcatにしたい文字列を確認しますか? –

答えて

6

あなたはこれらを試してみることができますが、レベルを定義することができ、

--exclude=GLOB 
       Skip files whose base name matches GLOB (using 
       wildcard matching). A file-name glob can use *, 
       ?, and [...] as wildcards, and \ to quote a wildcard 
       or backslash character literally. 

     --exclude-from=FILE 
       Skip files whose base name matches any of the file-name 
       globs read from FILE (using wildcard matching as 
       described under --exclude). 

     --exclude-dir=DIR 
       Exclude directories matching the pattern DIR from 
       recursive searches. 

をまたは検索して、このfind | xargs grep

を使用

EDIT

1つのコマンドを別のコマンドにパイプ出力することは、linux/unixの世界では非常に一般的です。私はあなたが毎日それをすると確信しています。

echo "abc"|sed 's/a/x/' 
find . -name "*.pyc" |xargs rm 
awk 'blahblah' file | sort |head -n2 
tree|grep 'foo' 
mvn compile|ack 'error' 
... 

上記のすべての例が効率的であるわけではありません。それらは単なる例です。

+0

迅速な回答ありがとうございます。あなたは、あなたの例を示しています。私はそれがdestにパイプ出力に使用できることは知っていますが、出力を別のコマンドにパイプするのはどういう意味があるのか​​分かりません。いずれにせよ、私はあなたの解決策を試しており、すぐにあなたの答えを受け入れるでしょう。 – Sal

+0

@Sal回答の編集を参照してください。 – Kent

10

Kentnotesの場合は、これをストレートgrepで行うことはできません。それだけでは十分強力ではありません。方法はfindを使用して検索するファイルを決定し、findが生成するファイルリストをgrepに渡します。

man findを実行すると、の多くのオプションのマニュアルページが表示されます。これはfindです。私たちがここに興味を持っているのは-maxdepthです。

必要なコマンドを作成しましょう。それがどのように見えるかを確認するために、各段階でのコマンドを実行します。

  • find .は、現在のフォルダ(.)、または任意の子孫のフォルダに存在するすべてのファイルとフォルダの一覧が表示されます。

  • find . -maxdepth 1現在のフォルダ内のすべてのファイルとフォルダを一覧表示します。 find . -maxdepth 2は同様に、現在のフォルダ内のすべてのファイルとフォルダとその直下のサブフォルダを一覧表示します。その他...

  • フォルダも表示されています。 grepはフォルダ自体を検索することができず、フォルダ内のファイルのみを検索することはできません。 -type fを追加すると、リストされたファイルのみが取得されます。find . -maxdepth 2 -type f

ここで、検索するファイルがわかっているので、grepを検索する必要があります。これを行うための標準的な方法はxargsを使用している:

find . -maxdepth 2 -type f | xargs grep <text-to-search-for> 

|はそれがxargの「標準にfindから「標準出力」、別名「標準出力」、(つまり、あなたは通常、画面に表示されるもの)とのパイプを取ります入力 "、別名" stdin "です。つまり、実行中のプログラムに入力した場合に通常どんなことが起こるのでしょうか。

xargsは、stdinで受け取ったすべての引数を追加した後、あなたがそれを教えてくれた小さなプログラムです(ここではgrep <text-to-search-for>)。その結果、grepは、findが見つけたすべてのファイルを検索します。

xargsは、1つのファイル名の一部ではなく2つの異なるファイル名がスペースで区切られていると考えているため、ファイル名の一部にスペースが含まれていると、これは機能しません。これを処理する方法はたくさんあります(理想的には、ファイル名にスペースを入れないことです)、共通のものは、より魅力的な機能の1つを使用することです。find

findに引数-execを追加すると、指定したすべてが;または+まで実行されます。 {}(それはリテラル文字{}です)を追加すると、すべてのファイルのリストに置き換えられます。 findはこれを実行しているので、ファイル名のスペースがファイル名に含まれるはずです。したがって

あなたがしようとしているものを行うための最善の方法は、このようです:

find . -type f -maxdepth 2 -exec grep <text-to-search-for> {} + 

+;で終わるとの違いはここに違いはありませんあなたが興味を持っている場合、それはman findにだが、。短いバージョンは+が速いということですが、コマンドには{}という文字が1つしかないことを意味します)。

関連する問題