Linuxで特定のテキストを含むすべてのファイルを見つけるにはどうすればよいですか?

2013年06月06日に質問されました。  ·  閲覧回数 7.1M回  ·  ソース

Nathan picture
2013年06月06日

Linuxシステム全体をスキャンして、特定のテキスト文字列を含むすべてのファイルを探す方法を見つけようとしています。 明確にするために、ファイル名ではなく、ファイル内のテキストを探しています。

これを行う方法を探していたときに、このソリューションに2回遭遇しました。

find / -type f -exec grep -H 'text-to-find-here' {} \;

ただし、機能しません。 システム内のすべてのファイルが表示されているようです。

これはそれを行うための適切な方法に近いですか? そうでない場合は、どうすればよいですか? ファイル内のテキスト文字列を見つけるこの機能は、私が行っているいくつかのプログラミングプロジェクトにとって非常に便利です。

回答

rakib_ picture
2013年06月06日
10236

以下をせよ:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -rまたは-Rは再帰的であり、
  • -nは行番号であり、
  • -wは、単語全体に一致することを意味します。
  • -l (小文字のL)を追加して、一致するファイルのファイル名を指定することができます。

これらに加えて、 --exclude--include--exclude-dirフラグを使用して効率的な検索を行うことができます。

  • これは、拡張子が.cまたは.hのファイルのみを検索します。

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • これにより、拡張子が.oで終わるすべてのファイルの検索が除外されます。

    grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • ディレクトリの場合、 --exclude-dirパラメータを使用して1つ以上のディレクトリを除外することができます。 たとえば、これにより、dirs dir1 /、dir2 /、および* .dst /に一致するすべてが除外されます。

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

これは私にとって非常にうまく機能し、あなたとほぼ同じ目的を達成します。

その他のオプションについては、 man grep確認してください。

fedorqui 'SO stop harming' picture
2013年06月06日
1626

grep -ilR使用できます:

grep -Ril "text-to-find-here" /
  • iは、大文字と小文字を区別しないことを表します(この場合はオプションです)。
  • Rは再帰を表します。
  • lは、「結果自体ではなく、ファイル名を表示する」を表します。
  • /は、マシンのルートから開始することを意味します。
Stephan picture
2013年06月06日
359

ackを使用できます。 これは、ソースコードのgrepのようなものです。 あなたはそれであなたのファイルシステム全体をスキャンすることができます。

ただしてください:

ack 'text-to-find-here'

ルートディレクトリ内。

正規表現を使用したり、ファイルタイプを指定したりすることもできます。


更新

シルバーサーチャーを発見しました.gitignoreファイルのパターンも無視します。

learner_19 picture
2014年03月15日
215

次を使用できます。

grep -r "string to be searched"  /path/to/dir

rは再帰を表すため、指定されたパスとそのサブディレクトリを検索します。 これにより、ファイル名がわかり、文字列が表示されているファイルの行が出力されます。

または、すべてのjavascriptファイル(* .js)を検索するために試行しているコマンド(例:)と同様のコマンド:

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

これにより、テキストが表示されるファイルの行が印刷されますが、ファイル名は印刷されません。

このコマンドに加えて、次のように書くこともできます。grep-rn "String to search" / path / to / directory / or / file -r:再帰検索n:一致する行番号が表示されます

A R picture
2013年07月31日
124

あなたはこれを使うことができます:

grep -inr "Text" folder/to/be/searched/
lkamal picture
2013年11月09日
82

特定のテキストを含むファイル名のリスト

まず、 -H代わりに-l -Hを使用したと思います。 また、引用符の中にテキストを追加してから、 {} \追加してみることもできます。

find / -type f -exec grep -l "text-to-find-here" {} \; 

ディレクトリ内で特定のテキスト「ApacheLicense」を含むファイルを検索しているとしましょう。 以下のような結果が表示されます(ディレクトリの内容によって出力が異なります)。

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

ケースの敏感さを取り除く

「text」と「TEXT」のように大文字と小文字を区別しない場合でも、 -iスイッチを使用して大文字と小文字を区別することができます。 詳細については、こちらをご覧

これがお役に立てば幸いです。

kenorb picture
2015年05月09日
79

grepGNUまたはBSD

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

grep -r "class foo" .

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

グロブ構文を使用して、次のような特定のファイル内を検索することもできます。

grep "class foo" **/*.c

注:グロブオプション** )を使用すると、特定の拡張子またはパターンですべてのファイルを再帰的にスキャンします。 すべてのファイル(非表示および拡張子なしを除く)またはその他のパタ​​ーンに**/*.*を使用することもできます。

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

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

または、 ripgrepます。

ripgrep

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

rg "class foo" .

GitHubプロジェクトページでドキュメント、インストール手順、またはソースコードを確認し

GNU / BSD grepucgagsiftackptような他のツールよりもはるかに高速ですRustの正規表現エンジン上に構築されているため。

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


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

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

grepが再帰検索をサポートしていない場合は、 findxargsを組み合わせることができます。

find / -type f | xargs grep 'text-to-find-here'

find -execの形式よりも覚えやすいと思います。

これにより、一致した行のファイル名と内容が出力されます。

/home/rob/file:text-to-find-here

grepに追加したいオプションのフラグ:

  • -i -大文字と小文字を区別しない検索
  • -l -一致が見つかったファイル名のみを出力します
  • -h -一致した行のみを出力します(ファイル名ではありません)
enfinet picture
2016年02月26日
46
grep -insr "pattern" *
  • i :PATTERNと入力ファイルの両方で大文字と小文字の区別を無視します。
  • n :出力の各行の前に、入力ファイル内の1から始まる行番号を付けます。
  • s :存在しないファイルまたは読み取り不可能なファイルに関するエラーメッセージを抑制します。
  • r :各ディレクトリの下にあるすべてのファイルを再帰的に読み取ります。
Neil Agarwal picture
2016年11月04日
44

TheSilversearcherと呼ばれる新しいユーティリティがあります

sudo apt install silversearcher-ag

Gitや他のVCSと緊密に連携します。 したがって、 .gitまたは別のディレクトリには何も取得されません。

あなたは単に使用することができます

ag "Search query"

そしてそれはあなたのために仕事をします!