web-dev-qa-db-ja.com

findとgrepを組み合わせて、/ home / smith / sourcecodeの* .htmlファイルと* .phpファイルでstrまたはstr2を再帰的に検索するにはどうすればよいですか?

findgrepを組み合わせて、/という名前のディレクトリから始まるすべての* .htmlファイルと* .phpファイルでstr1またはstr2を再帰的に検索するにはどうすればよいですか。ホーム/スミス/ソース?出力には、実際に一致した文字列ではなく、ファイル(パス付き)をリストするだけで済みます。私は成功せずに多くのバリエーションを試しました。 1つのファイルパターンまたは1つの文字列に対してこれを行う方法の例はたくさんありますが、複数のファイルパターンおよび複数の文字列ではありません--再帰的に

2
Ascoobis

他はすべて正しいですが、grepの最新バージョンが利用可能であるため、私の意見ではやり過ぎです。以下は、拡張子が.htmlまたは.phpのファイルのみを再帰的にスキャンし、str1またはstr2のいずれかに一致する少なくとも1行の各ファイルのパスを含むファイル名を返します。繰り返される-eオプションを使用すると、正規表現構文を使用せずに複数のパスを指定できることに注意してください。

grep -r --files-with-matches --include '。html' --include '。php' -e str1 -e str2/home/smith/source

1つのツール、1つのプロセス、関連性のないファイルの追加のフォークやスキャンは不要です。 --includeオプションには比較的新しいバージョンのgnugrepが必要ですが、他の人が提案したように多段階のgrepを実行する必要があります。

4
Tom Scogland
egrep 'string1|string2' /home/smith/source/*.{html,php}

または、ディレクトリ内の任意のタイプのファイルを再帰的に調べます。

egrep -R 'string1|string2' /home/smith/source

それをパイプ内の別のegrepと組み合わせることができます:

egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'
3
iamauser

ackを使用する場合( http://beyondgrep.com を参照)、これを行うことができます。

ack --php --html -l 'str1|str2' /home/smith/source
1
Andy Lester

egrepを使用して|を使用しますstr1またはstr2-を指定するには:

find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;
1
suspectus

名前だけでファイルを検索したい場合は、シェルがfindよりもはるかに便利であることを忘れないでください。

Bash:

shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}

魚:

grep -lE 'str1|str2' /home/smith/source/**.{html,php}
0
user2394284