ディレクトリ内のすべてのファイルに対してgrep操作を実行する方法


218

xenserverで作業していて、ディレクトリにある各ファイルに対してコマンドを実行し、コマンドの出力からいくつかのものをgreppingしてファイルに追加したいと考えています。

使用したいコマンドと、必要に応じて文字列をgrepする方法は明確です。

しかし、はっきりしないのは、各ファイルでこのコマンドを実行して、ファイルが見つからなくなるまで次のファイルに進む方法です。

回答:


228

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


37
「grep -r $ PATTERN」十分なものです。再帰的なgrepの場合、すべてのファイルを指定する必要はありません
Cougar

1
複数の拡張機能を含めるにはどうすればよいですか?例えば。「* .cpp」、「*。h」?
トマーシュZato -復活モニカ

1
@TomášZato、*ではなく、すべてのファイルパターンを指定してくださいgrep $PATTERN *.cpp *.h。どのファイルをgrepするかについてより具体的なルールが必要な場合は、findコマンドを使用します(Robの回答を確認してください)。
umi 2016年

@umi実行grep -r x .すると、すべての拡張子のすべてのファイルから結果が返されます。実行した場合grep -r x *.scss、結果は得られません。
Chris

1
@Chris *.scss現在のディレクトリにファイルがない可能性がありますが、サブディレクトリのどこかに深いため、grepは必要なすべてのファイルを調べません。--includeオプションを使用して、特定のパターンに一致するファイルを再帰的に検索するようにgrepに指示する必要がありますgrep -r x --include '*.scss' . (引用符に注意してください。これにより、パターンがシェルによって展開されなくなります)。または単に使用しますfind(Robの回答を参照)。
umi

168

Linuxでは通常、このコマンドを使用して、dir内の特定のテキストを再帰的にgrepします

grep -rni "string" *

どこ、

r =再帰的、つまり現在のディレクトリ内のサブディレクトリを検索
n =行番号を標準出力に出力する
i =大文字と小文字を区別しない検索


32

検索を使用します。真剣に、それはあなたがそれが実際にそれが操作しているファイルを見ることができるので最良の方法です:

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

-HはMac固有であり、結果にファイル名を表示します。


7
findを使用する場合は、grepごとに新しいプロセスを生成し、ファイル数が多いとオーバーヘッドが大きくなるため、これをxargs使用するよりも出力をパイプ処理する方-execはるかに高速に-execなります。ファイル名のスペースに関する標準の警告がに適用されxargsます。
Barton Chittenden、2015

2
これは正確にはどのように見えますか?私はいつもxargs構文を忘れます。
ブライアンピーターソン2015年

3
@BrianPetersonは次のようになりますfind . -iname "*.sql" -print0 | xargs -0 grep "slow"
。– MediaVince

4

すべてのサブディレクトリを検索するには、特定のファイルタイプのみを検索するには、でgrepを使用し--includeます。

たとえば、現在のディレクトリで* .ymlと* .yamlのテキストを再帰的に検索します。

grep "text to search" -r . --include=*.{yml,yaml}

1

複数のコマンドを実行する場合は、以下を使用できます。

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.