find
とgrep
を組み合わせて、/という名前のディレクトリから始まるすべての* .htmlファイルと* .phpファイルでstr1
またはstr2
を再帰的に検索するにはどうすればよいですか。ホーム/スミス/ソース?出力には、実際に一致した文字列ではなく、ファイル(パス付き)をリストするだけで済みます。私は成功せずに多くのバリエーションを試しました。 1つのファイルパターンまたは1つの文字列に対してこれを行う方法の例はたくさんありますが、複数のファイルパターンおよび複数の文字列ではありません--再帰的に。
他はすべて正しいですが、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を実行する必要があります。
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'
ack
を使用する場合( http://beyondgrep.com を参照)、これを行うことができます。
ack --php --html -l 'str1|str2' /home/smith/source
egrep
を使用して|を使用しますstr1またはstr2-を指定するには:
find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;
名前だけでファイルを検索したい場合は、シェルがfind
よりもはるかに便利であることを忘れないでください。
Bash:
shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}
魚:
grep -lE 'str1|str2' /home/smith/source/**.{html,php}