web-dev-qa-db-ja.com

ファイル内の文字列/正規表現の一致を再帰的に見つけるための最良の方法は何ですか? (UNIX)

通常、変数または関数が使用されているファイルを見つけようとするときに、これを数回実行する必要がありました。

過去にgrepでxargsを使用してこれを行ったことを覚えていますが、もっと簡単な方法があるかどうか疑問に思っています。

24
Murat Ayfer
grep -r REGEX .

.を検索したいディレクトリに置き換えます。

27

これを行うためのポータブルな方法*は

find . -type f -print0 | xargs -0 grep pattern

-print0はfindにASCII nulsを区切り文字として使用し、-0はxargsに同じことを伝えます。それらを使用しない場合、名前にスペースが含まれているファイルやディレクトリでエラーが発生します。

*一部のマシンでのみ機能するgrep-r、grep -R、またはgrep--recursiveとは対照的です。

13
Chas. Owens

これは私がackhttp://petdance.com/ack/ )を使い始めたケースの1つです。 )grepの代わりに。このサイトから、Perl CPANコンポーネントとしてインストールする手順を入手するか、依存関係を処理せずにインストールできる自己完結型のバージョンを入手できます。

デフォルトでは再帰検索になっているという事実に加えて、Perl強度の正規表現を使用したり、正規表現を使用して検索するファイルを選択したりすることができます。オプションの印象的なリストがあります。サイトにアクセスしてチェックすることをお勧めします。非常に使いやすいことがわかりました。vi(m)、emacs、さらにはTextMateと統合するためのヒントがあります。

7
rjray

文字列の一致を探している場合は、

fgrep -r pattern .

これはgrepを使用するよりも高速です。ここで主題についての詳細: http://www.mkssoftware.com/docs/man1/grep.1.asp

5
Gabriel Gilini

GNU grepを使用している場合は、grep -r。これは、ほとんどのLinuxディストリビューションに付属しています。

ほとんどのUNIXでは、デフォルトでインストールされていないため、代わりにこれを試してください。

見つける。 -タイプf | xargs grep regex

3
CaptainPicard

Zshシェルを使用する場合は、

grep REGEX **/*

または

grep REGEX **/*.Java

一致するファイルが多すぎると、Steamが不足する可能性があります。

ただし、標準的な方法は、execでfindを使用することです。

find . -name '*.Java' -exec grep REGEX {} \;

または

find . -type f -exec grep REGEX {} \;

'type f'ビットはファイルのタイプを意味し、すべてのファイルに一致します。

3
Darren Greaves

答えを次のように変更することをお勧めします。

grep REGEX -r .

-rスイッチは正規表現を示していません。提供されたディレクトリに再帰するようにgrepに指示します。

2
Scott

これは、1つ以上のファイルタイプで正確な式を再帰的に見つけるための優れた方法です。

find . \\( -name '\''*.Java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep(内部一重引用符)

どこ

_-name '\''*.<filetype>'\'' -o_(ここでも一重引用符)

再帰検索に追加するファイルタイプの数を括弧()で繰り返します。

エイリアスはbashでは次のようになります

alias fnd='find . \\( -name '\''*.Java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

1
trickster