"Grep"コマンドを使用してサブディレクトリを含むテキストを検索する方法

特定のテキスト文字列を含むすべてのファイルを検索したい。 その grep コマンドは機能しますが、すべてのディレクトリで使用する方法がわかりません(現在のディレクトリでのみ使用できます)。 私は読んでみました man grep しかし、それは何の助けも得られませんでした。

それは使用する方が良いでしょう

grep -rl "string" /path

どこで

  • -r (または --recursive)オプションは、のすべてのサブディレクトリもトラバースするために使用されます /path 一方、
  • -l (または --files-with-matches)オプションは、一致するファイルのファイル名のみを印刷し、一致する行を印刷するために使用されます(これはまた、速度を向上させる可能性があり grep このオプションとの最初の一致時にファイルの読み取りを停止します)。

ファイル内で一致する行を探しているなら、私のお気に入りのコマンドは:

grep -Hrn 'search term' path/to/files
  • -H ファイル名を印刷します(複数のファイルが検索された場合に暗黙的に表示されます)。
  • -r 再帰的な検索を行います
  • -n 行番号を印刷します

path/to/files することができます . 現在のディレクトリ内を検索するには

私は非常に便利だと思うさらなるオプション:

  • -I バイナリファイルを無視する(補完: -a すべてのファイルをテキストとして扱う)
  • -F トリート search term 正規表現ではなくリテラルとして
  • -i 大文字と小文字を区別しない検索を行う
  • --color=always 配管しても強制的に色を付けるには less. 作るため less サポート色、使用する必要があります -r オプション:

    grep -Hrn search . | less -r
  • --exclude-dir=dir 次のようなディレクトリを除外するのに便利 .svn.git.

Example output

私はあなたがこのようなものを使うことができると信じています:

find /path -type f -exec grep -l "string" {} \;

コメントからの説明

find 指定されたパスのサブディレクトリ内のディレクトリやリンクのようなファイルやその他のオブジェクトを検索できるコマンドです。 Filesnamesが満たすべきマスクを指定しない場合、すべてのディレクトリオブジェクトが列挙されます。

  • -type f ディレクトリなどではなくファイルのみを処理するように指定します。
  • -exec grep 見つかったすべてのファイルに対して、grepコマンドを実行し、ファイル名を引数として渡し、置き換えてgrepコマンドを実行するように指定します {} ファイル名を指定して

私のデフォルトのコマンドは

grep -Rin string *

私はキャピトル'R'を使用しています。 ls 再帰的に使用します。 Grepは両方を受け入れるので、それを使用しない理由はありません。

編集:hvnsweetingごとに、明らかに -R シンボリックリンクに従います。 -r しません。

あなたが何か新しいことを試して喜んでいる場合は、与えます ack 一発だ 現在のディレクトリを再帰的に検索するコマンド string は:

ack string

インストールは非常に簡単です:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(すでにディレクトリを持っていれば ~/bin そして、それは好ましくはあなたの中にあります PATH.)

コマンドrgrepは、そのような必要性に特化しています

利用できない場合は、次のように入手できます

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

上記のように、デフォルトのgrepオプションに直接設定することができます。

私はpersonnaly使用します

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

関連トピック : 常に色でrgrepを使用する方法

更新2:

このコマンドの行は、以下を使用しています findgrep 問題を修正します:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> 着色された出力のため:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

例:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

以下のスナップショットで実行する例:


更新1:

あなたは次のコードを試すことができます;あなたの中の関数として .bashrc または .bash_aliases またはスクリプトで:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

使用法: wherein /path/to/search/in/ searchkeyword

例:

$ wherein ~/Documents/ "hello world"

(注:@enzotibによる以下のコメントで示唆されているように、これは名前にスペースを含むファイル/ディレクトリでは機能しません。)


元の投稿

文字列を検索し、その行だけを検索文字列で出力するには:

$ for i in $(find /path/of/target/directory -type f); do \    grep -i "the string to look for" "$i"; done

例えば、:

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

検索文字列を含むファイル名を表示するには:

$ for i in $(find /path/of/target/directory -type f); do \    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

例えば、:

$ for i in $(find /usr/share/applications -type f); \    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \    fi; done;

grep (GNU または BSD)

あなたが使用することができます grep 現在のフォルダを再帰的に検索するツール -r 変数、のような:

grep -r "pattern" .

メモ: -r -再帰的にサブディレクトリを検索します。

特定のファイル内を検索するには、次のコマンドを使用できます。 globbing構文 のような:

grep "class foo" **/*.c

注:使用することによって globbingオプション (**)、それは特定の拡張子またはパターンで再帰的にすべてのファイルをスキャンします。 この構文を有効にするには、次を実行します: shopt -s globstar. また、以下を使用することもできます **/*.* すべてのファイル(非表示および拡張子なしを除く)またはその他のパターン。

引数が長すぎるというエラーがある場合は、検索を絞り込むことを検討するか、次のように使用してください find 代わりに次のような構文:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

代わりに使用して下さい ripgrep.

ripgrep

大きなプロジェクトや大きなファイルで作業している場合は、次を使用する必要があります ripgrep 代わりに、のように:

rg "pattern" .

のドキュメント、インストール手順、またはソースコードをチェックアウトします。 GitHubプロジェクトページ.

それはのような他のどのツールよりもはるかに速いです GNU/BSD grep, ucg, ag, sift, ack, pt または同様の、それはの上に構築されているので Rustの正規表現エンジン 有限オートマトン、SIMD、積極的なリテラル最適化を使用して、検索を非常に高速にします。

で指定された無視パターンをサポートしています .gitignore 単一のファイルパスは、同時に複数のglobパターンに対して一致させることができます。


次のような一般的なパラメータを使用できます:

  • -i -鈍感な検索。
  • -I -バイナリファイルを無視します。
  • -w -(部分的な単語の一致の反対に)全体の単語を検索します。
  • -n -あなたの試合のラインを表示します。
  • -C/--context (例: -C5)-コンテキストを増加させるので、周囲のコードが表示されます。
  • --color=auto -一致するテキストをマークアップします。
  • -H -テキストが見つかったファイル名を表示します。
  • -c -一致する行の数を表示します。 と組み合わせることができます -H.

私はxargs、非常に過小評価されたコマンドを使用してこれを行います

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

見つける。 現在のフォルダ内のすべてのファイルの再帰的なリストを提供します次に、それらのファイルのそれぞれに対してgrepコマンドを実行するxargsにパイプ

私はここにたくさんの答えがあることを知っていますが、ファイルを検索するときに他の制限を追加したい場合は、ここに別の方法があります:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

これは動作します grep 結果が見つかった場合は0を返し、それ以外の場合は1を返します。 たとえば、1MBの大きなファイルを見つけることができます 何かを含む:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

複数の要件の場合は、オプティマイザフラグを使用することをお勧めします -O それはGNU grepに存在します。

`–Include="*を使用したワイルドカード。C"'オプション、@user311346、@Lekensteynに感謝します。

grep-RIn*は、すべてのテキストファイルの現在のディレクトリから検索します。
*のようなファイルパターンで再帰的に検索を行う方法がわかりません。GrepのみのC

Findとgrepの組み合わせを使用して、現在およびすべてのサブディレクトリ内の文字列をファイルで再帰的に検索します。 これをチェックhttp://wilddiary.com/find-files-containing-my-text/