2013-03-08 9 views
110

xenserverを使用していて、ディレクトリ内にある各ファイルに対してコマンドを実行し、コマンドの出力からいくつかのものをグレープしてファイルに追加します。ディレクトリ内のすべてのファイルに対してgrep操作を実行する方法

私は使いたいコマンドと、必要に応じて文字列をgrepする方法についてはっきりしています。

しかし、私は明らかにしていないのは、ファイルが見つからなくなるまで、次のファイルにこのコマンドを実行させる方法です。

答えて

58

Linuxでは、私は通常、再帰的に、どこDIR

grep -rni "string" * 

内の特定のテキストをgrepするには、このコマンドを使用し

R =再帰すなわち、現在のディレクトリ内の検索サブディレクトリ
のn = stdoutに行番号を表示する
i =大文字小文字を区別しない検索

132

grep $PATTERN *で十分でしょう。デフォルトでは、grepはすべてのサブディレクトリをスキップします。しかし、それらをgrepしたい場合は、grep -r $PATTERN *が該当します。

+22

"はgrep -rの$パターンを。"十分なものです。再帰的なgrepでは、すべてのファイルを指定する必要はありません – Cougar

+1

複数の拡張子を含めるにはどうすればよいですか?例えば。 "\ *。cpp"、 "\ *。h"? –

+1

@TomášZatoは、*: 'grep $ PATTERN * .cpp * .h'ではなく、すべてのファイルパターンを提供しています。どのファイルをグレップする必要があるかについてより詳細なルールが必要な場合は、 'find'コマンドを使用してください(Robの答えをチェックしてください)。 – umi

21

findを使用してください。そして、あなたは本当にそれが上で動作のファイルかを見ることができるので、真剣に、それが最善の方法である:

find . -name "*.sql" -exec grep -H "slow" {} \; 

注意、-HがMAC固有のものである、それが結果にファイル名が表示されます。あなたが複数のコマンドを実行したい場合は

+5

findを使う場合は、 '-exec'を使うのではなく' xargs'を通して出力をパイプします。これは '-exec'が各grepに対して新しいプロセスを生成し、オーバーヘッドが多数のファイルファイル名のスペースに関する標準的な警告は 'xargs'に適用されます。 –

+2

これは正確にどのように見えるでしょうか?私はいつも 'xargs'構文を忘れています。 –

+1

@BrianPetersonそれはそれのようなものでしょう: 'find。 -iname "* .sql" -print0 | xargs -0 grep "slow" ' – MediaVince

2

、あなたが使用できます。

for I in `ls *.sql` 
do 
    grep "foo" $I >> foo.log 
    grep "bar" $I >> bar.log 
done 
関連する問題