web-dev-qa-db-ja.com

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

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

363
Smile.Hunter

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

grep -rl "string" /path

どこ

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

ファイル内で一致する行を探している場合、私のお気に入りのコマンドは次のとおりです。

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

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

私が非常に便利だと思うその他のオプション:

  • -Iバイナリファイルを無視します(補足:-aすべてのファイルをテキストとして扱います)
  • -Fsearch termを正規表現ではなくリテラルとして扱います
  • -i大文字と小文字を区別しない検索を行います
  • --color=alwaysは、lessをパイピングするときにも色を強制します。 lessをサポート色にするには、-rオプションを使用する必要があります。

    grep -Hrn search . | less -r
    
  • --exclude-dir=dirは、.svn.gitなどのディレクトリを除外するのに役立ちます。

Example output

163
Lekensteyn

次のようなものを使用できると思います。

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

コメントからの説明

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

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

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

grep -Rin string *

lsが再帰に使用するため、私は国会議事堂 'R'を使用します。 grepは両方を受け入れるため、使用しない理由はありません。

編集:HVNSweetingごとに、明らかに-Rはシンボリックリンクをたどりますが、-rはそうではありません。

19
user606723

新しいことを試してみたい場合は、 ack を試してみてください。 stringの現在のディレクトリを再帰的に検索するコマンドは次のとおりです。

ack string

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

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

(既にディレクトリ~/binを取得しており、PATHにあることが望ましい場合)

12
Konrad Rudolph

コマンドrgrepはこのようなニーズ専用です

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

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

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

私は個人的に使用します

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

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

4
mnono

grepGNU または BSD

grepツールを使用して、次のように-rパラメーターを使用して現在のフォルダーを再帰的に検索できます。

grep -r "pattern" .

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

特定のファイル内を検索するには、次のような globbing syntax を使用できます。

grep "class foo" **/*.c

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

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

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

または、 ripgrep を使用します。

ripgrep

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

rg "pattern" .

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

GNU / BSDgrep のような他のツールよりもはるかに高速です。 ucgagsiftackpt など。 Rustの正規表現エンジン の上に構築されるため、有限オートマトン、SIMDおよび積極的なリテラル最適化を使用して非常に高速に検索します。

.gitignoreファイルで指定された無視パターンをサポートしているため、単一のファイルパスを複数のグロブパターンと同時に照合できます。


次のような共通パラメーターを使用できます。

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

更新2:

findおよびgrepを使用する次のコマンド行は、問題を修正します。

$ 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 +

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


更新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;
2
precise

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

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

find ./は、現在のフォルダー内のすべてのファイルの再帰的なリストを提供し、それらを各ファイルでgrepコマンドを実行するxargsにパイプします

1
deadprogrammer

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

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

これは、grepが結果を検出した場合は0を返し、そうでない場合は1を返すため、機能します。たとえば、1 MBのサイズのファイルを見つけることができますand何かを含む:

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

複数の要件の場合、おそらくGNU grepに存在するオプティマイザーフラグ-Oを使用する必要があります。

0
Ztyx

C、CPPコードで検索するスクリプト(コード内検索):

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"

つかいます:

find-in-code "search string"
0
nvd