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


5259

Linuxシステム全体をスキャンして、特定のテキスト文字列を含むすべてのファイルを検索する方法を探しています。わかりやすくするために、ファイル名ではなく、ファイル内のテキストを探しています。

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

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

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

これは適切な方法に近いですか?そうでない場合、どうすればよいですか?ファイル内のテキスト文字列を検索するこの機能は、私が実行しているいくつかのプログラミングプロジェクトに非常に役立ちます。


21
特にgrepは、任意の.ものを1文字のワイルドカードとして解釈することに注意してください。私のアドバイスは、常にfgrepまたはegrepを使用することです。
Walter Tross 2013年

10
とにかく、あなたはほとんどそこにいました!で置き換え-Hてください-l(おそらくgrepで置き換えfgrepます)。名前の特定のパターンを持つファイルを除外するにfindは、より高度な方法で使用します。findただし、を使用することを学ぶ価値があります。ただman find
Walter Tross 2013年

6
find … -exec <cmd> +は入力が簡単で、よりも高速ですfind … -exec <cmd> \;。これ<cmd>は、任意の数のファイル名引数を受け入れる場合にのみ機能します。<cmd>PythonまたはRubyスクリプトのように起動が遅い場合、実行時間の節約は特に大きくなります。
hagello 2016年

与えられたパスを非再帰的に検索するには、コマンドは `grep --include = *。txt -snw" pattern "thepath / *です。
ステファン・ローラン

@StéphaneLaurent複雑すぎると思います。ただ言うgrep "pattern" path/*.txt
fedorqui「SO害を停止」

回答:


9523

以下をせよ:

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パラメータを使用して特定のディレクトリを除外することができます。たとえば、dirs dir1 /、dir2 /、および* .dst /に一致するそれらすべてが除外されます。

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

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

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


74
--excludeを使用します。「grep -rnw --exclude = *。o 'directory' -e "pattern"
rakib_

98
注目に値しrます:オプションは遅延(最初のディレクトリの後で停止するよりも、深さ優先で移動)である一方R、貪欲(ツリー全体を正しく移動します)のようです。
Eliran Malka 2015

5
grep -rnw「探していた文字列」は、必要なことを行いました。ありがとう!
ViliusK 2015

33
注(特に初心者の場合):上記のコマンドの引用符は重要です。
madD7

69
@Eliran Malka Ren rはどちらもディレクトリを正しく通過しRますが、シンボリックリンクをたどります。
bzeaman

1499

使用できますgrep -ilR

grep -Ril "text-to-find-here" /
  • i 大文字小文字の区別を省略します(オプションの場合)。
  • R 再帰を表します。
  • l 「結果そのものではなく、ファイル名を表示する」の略です。
  • / マシンのルートから始まることを意味します。

85
私の経験に基づくと、これ-iにより速度が大幅に低下するため、必要がない場合は使用しないでください。特定のディレクトリでテストしてから、一般化してください。数分で完了します。正規表現だと遅くなると思います。しかし、私のコメントは想定に基づいています。私はあなたにそれをtime行の前でテストすることをお勧めします。
fedorqui 'SO stop harming' 2013

4
はい、その/*意味です。とにかく私はちょうどそれをテストし、それが/うまくいくことに気づきました。
fedorqui 'SO stop harming' 2013

10
正規表現を使用して検索しない場合は、ほとんどのシステムでgrepの代わりにfgrepを使用できます。
markle976

8
はい@ markle976、実際には男のgrepから:fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
fedorqui 'SO stop harming' 2013

17
/をディレクトリへのパスに置き換えるgrep -Ril "text-to-find-here" ~/sites/か、を使用できます。現在のディレクトリの場合grep -Ril "text-to-find-here" .
ブラック

329

ackを使用できます。ソースコードのgrepのようなものです。それを使用してファイルシステム全体をスキャンできます。

ただやる:

ack 'text-to-find-here'

ルートディレクトリ。

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


更新

私はちょうどシルバーサーチャーを発見しましたこれはackに似ていますが、それよりも3〜5倍速く、.gitignoreファイルからのパターンも無視します。


57
非常に便利で、シンプルで高速です。警告:「Debianから派生したディストリビューションでは、ackはすでに存在するため、ack-grepとしてパッケージ化されています(beyondgrep.com/installから)。これらのLinuxで漢字コードコンバーターを実行してしまう可能性があります...
Jose_GD

11
ACKまたはACK-grepが素敵なハイライトを持っていますが、使用済みの適切な性能ではるかに優れているとき+はgrepを見つける
SławomirLenart

14
ripgrepは、Silver Searcherやプレーン 'ol grepを含め、ここで説明する他のどの方法よりも高速であることに注意してください。証明については、このブログ投稿を参照してください。
Radon Rosborough、2017年

194

以下を使用できます。

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 "検索する文字列" / path / to / directory / or / file -r:再帰検索 n:一致する行番号が表示されます


1
検索バージョンをありがとう。私のgrepバージョン(NASのBusybox)には-rオプションがありません。本当に別のソリューションが必要でした!
jc

3
「検索」バージョンをありがとう!' .js'や ' .txt'などでフィルタリングできることは非常に重要です。コマンドが次の場合でも、grepが家族での最後の休暇からすべてのマルチギガバイトのビデオを検索するのを待つのに何時間も費やしたくはありません。入力しやすい。
マイティパイル2017

承認されたバージョンよりも優れたgrep、受け入れられたものはハーフワードを検索しないため
waza123

114

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

grep -inr "Text" folder/to/be/searched/

12
最も簡単で、冗長で、再帰的で、大文字と小文字を区別しません。いいぞ。
Francesco Casula

-A3を追加するとさらに優れています
albanx

73

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

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

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

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

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$ 

大文字と小文字の区別を削除する

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

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


2
これは、このコマンドの機能です。find検出したすべてのパスをコマンドに渡しますgrep -l "text-to-find-here" <file found>"。ファイル名に制限を追加することができます。たとえばfind / -iname "*.txt"、名前が次で終わるファイルのみを検索する.txt
Mene

1
@Auxiliary-読者の混乱を避けるためにサンプル出力が含まれています。
lkamal 2017年

2
@Mene Auxiliaryのコメントがあなたよりも投票数が多いのは本当に悲しい状態です...彼らのコメントが2014年からであり、あなたのコメントが2017年であっても、コメントが正確に0であり、あなたのコメントは1つ(現在は2つ)しかない場合、コメントは6です。私が信じたいものではありません。
プリフタン2018年

@Mene言われていること-inameは、大文字と小文字を区別しないことを意味します。つまり、.TXTファイルや、TxTやTXtなども検出されます。
プリフタン2018年

66

grepGNUまたはBSD

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

grep -r "class foo" .

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

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

grep "class foo" **/*.c

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

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

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

またはを使用しますripgrep

ripgrep

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

rg "class foo" .

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

それははるかに高速のような他のツールよりもだGNU / BSD grepucgagsiftackptそれは上に構築されているため、または類似の錆の正規表現エンジンは非常に高速な検索を行うために、有限オートマトン、SIMDと積極的なリテラル最適化を使用しています。

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


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

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

1
拡張グロビングも便利だと思います。ただし、ファイルの数が非常に多い場合は、「引数リストが長すぎます」というエラーが発生する可能性があることに注意してください。(単純なグロビングもこの種のエラーを起こしやすい)。
Yoory N. 2017

2
ファイルシステム全体を吸引する場合、rgは他のほとんどのツールよりもはるかに簡単です。
LK

55

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

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

これは、の形式より覚えやすいと思いますfind -exec

これは、一致した行のファイル名と内容を出力します。例えば

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

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

  • -i -大文字と小文字を区別しない検索
  • -l -一致が見つかったファイル名のみを出力します
  • -h -一致した行のみを出力します(ファイル名ではありません)

3
何も見つからないgrep 'text-to-find-here'場合、これはファイル名なしの場合と同じfindです。これはハングし、ユーザー入力を待ちます。--no-run-if-emptyオプションとしてに追加しますxargs
hagello 2016年

3
この検索とxargsの組み合わせは、ファイルまたはディレクトリ名にスペース(xargsが区切り文字として解釈する文字)が含まれている場合、意図したとおりに機能しません。を使用しfind … -exec grep … +ます。xargsと一緒にfindを使用する場合は-print0、およびを使用してください-0
hagello 2016年

43
grep -insr "pattern" *
  • i:PATTERNと入力ファイルの両方で大文字と小文字の区別を無視します。
  • n:出力の各行の先頭に、入力ファイル内の1ベースの行番号を付けます。
  • s:存在しないファイルまたは読み取り不可能なファイルに関するエラーメッセージを抑制します。
  • r:各ディレクトリの下のすべてのファイルを再帰的に読み取ります。

3
あなたの答えが他の答えをどのように改善するか、それがそれらと十分に異なるかを説明できますか?
Amos M. Carpenter、

覚えるのはそれほど複雑ではなく、すべてのパターンをカバーし(大文字と小文字の区別->オフ、ファイル名と行番号を含み、再帰的に検索するなど)、最後に「*」を使用すると、すべてのディレクトリが検索されます(指定する必要はありません)パスまたはディレクトリ名)。
2016

すみません、もっと明確にしておくべきでした。その説明を回答に含めていただければ幸いです。現状では、特に他の多くの同様の回答がすでにあるため、このような短い回答から、受け入れられた回答または賛成された回答の1つを試しみるメリットが何であるかを理解することは困難です。
Amos M. Carpenter

6
@ AmosM.Carpenterこの回答について私が気に入っていることの1つは、抑制の引数を指摘することです。これは、実際に必要な結果を得るのに重要ではないノイズを除外するのに役立ちます。Grepは、「関数が実装されていません」、「無効な引数」、「リソースを利用できません」などのエラーを特定の「ファイル」に出力します。
leetNightshade

@leetNightshade:私はまばらな元の投稿についての説明を求めたので、あなたが私にあなたのコメントに対処していると思います。私の以前のコメントが意味をなすように、Fabioのすばらしい改訂を見てください。
Amos M. Carpenter

39

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

sudo apt install silversearcher-ag

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

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

ag "Search query"

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


35

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

私はこのソリューションに2回遭遇しました:

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


使用している場合は検索あなたの例のように、より良い追加-s--no-messagesに)をgrep、と2>/dev/nullの回避ロットへのコマンドの末尾に許可拒否によって発行されたメッセージをgrepfind

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

findは、Unixのようなプラットフォームで、ファイルを検索するための標準ツールです。特定のテキストを検索するときにgrepと組み合わせます。検索コマンドは、多くの場合と組み合わされ xargsの方法により、。

同じ目的で、より速くて簡単なツールが存在します-以下を参照してください。もちろん、お使いのプラットフォーム利用できる場合は、お試しください。

より速くて簡単な代替手段

RipGrep-最速の検索ツール:

rg 'text-to-find-here' / -l

シルバーサーチャー

ag 'text-to-find-here' / -l

ack

ack 'text-to-find-here' / -l

注:追加できます 2>/dev/nullこれらのコマンドにして、多くのエラーメッセージを非表示にすることもできます。


警告本当に避けられない場合を除いて、「/」(ルートディレクトリ)から検索しないでください。長くて非効率的な検索を回避できます。したがって、上記の例では、あなたがより良い「を置換したい/あなたが実際に検索したい場所によってはサブディレクトリ名、例えば「/ホーム」で」...


「findは、Unixのようなプラットフォームで特定のテキストを含むファイルを検索するための標準ツールです」というのは、私にはあいまいなようです。再帰以外でもgrep find、ファイル内を直接テキストで検索することはありません。そして、おそらくそれらの追加のツールは、古いタイマーや一部の慣れ親しんだ人に役立つかもしれませんgrep。彼らは役に立たないとは言っていません。
プリフタン共和国

"....特定のテキストを含む...":文のこの部分は正確ではありませんでした(検索のこの部分を処理することができないため)。編集。ありがとう。
Bludzee

お役に立てて嬉しいです!一目でわかる他の唯一のことは、フォルダーという単語をディレクトリに変更することですが、それが私の十字軍であり、完全に勝つことは決してありません。しかしあきらめない...
Pryftan

「フォルダ」ではなく「ディレクトリ」ではなく、なぜですか。あなたの「十字軍」を共有してください!
Bludzee

代わりにディレクトリを使用すると言っています!参照:「/」をサブフォルダ名に置き換えた方がいいでしょう。Windowsでさえ「ディレクトリ」と呼んでいたので、これは私にとっては不愉快なことです。ああ、多分あなたはそれを手に入れました。どうして?まあ、それが呼ばれているからです。これはファイルシステムレベルでも呼ばれます。そして、これをこのように見てくださいfol。もちろん違います。それは呼び出されましたdir(私はそれがまだあると信じています)。フォルダーはユーザーの親しみやすさのために考案されたものだと思いますが、この場合、あまり「高度な」ユーザーのためにそれを弱体化しているのでしょうか?
プリフタン

29

試してください:

find . -name "*.txt" | xargs grep -i "text_pattern"

5
これは実際には、xargsそのように使用しない場合の主な例です。これを検討してください。 echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this fooxargsここで間違ったファイルを一致し、意図したファイルと一致しませんでした。aを使用するfind .. -print0 | xargs -0 ...が、それはパイプの無駄な使用以上であるfind ... -exec grep ... {} +
shalomb

29

pwd下に再帰して、現在のディレクトリから検索するために使用します

grep -rnw `pwd` -e "pattern"

更新 使用しているgrepのバージョンに応じて、を省略できますpwd。新しいバージョンで.は、ディレクトリが指定されていない場合、grepのデフォルトのケースのようです。

grep -rnw -e "pattern"

または

grep -rnw "pattern"

上記と同じことをします!


3
pwdこれはデフォルトなので、使用する必要はまったくありません。grep -rnw "pattern"十分です。
fedorqui 'SO stop harming'

実際、grep -rnw3年前の回答と同様の回答ですが、この回答がどのように付加価値をもたらすかはわかりません。
fedorqui 'SO stop harming'

選択された回答はデフォルトのパターンを示しておらず、5人がそれが有用であると感じているようです
mahatmanich

「デフォルトパターン」とはどういう意味ですか?受け入れられた回答にgrep -rnw '/path/to/somewhere/' -e "pattern"は、ここにあるものが含まれています。230万回の訪問後の5票はそれほど意味がありません。
fedorqui「SOが危害を加えるのをやめる」

同意します:-)元の回答で欠けていたのは、パスをまったく指定する必要がない、または現在のディレクトリを再帰的に検索する必要がないというユースケースです。これは、受け入れられた回答に反映されません。したがって、少し深く掘り下げることは、grepについての良い学習経験でした。
mahatmanich 2016

19

grep 文字列を探していなくても使用できます。

単に実行し、

grep -RIl "" .

すべてのテキストファイル、つまり印刷可能な文字のみを含むファイルへのパスを出力します。


2
私は、これは単なるより優れているのはどのように表示されていないlsかをfind(再帰的なため)
「SOストップ傷つける」fedorquiを

17

ファイルの検索に使用できるコマンドのいくつかのリストを次に示します。

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

5
これは既存の回答に何を追加するのですか?
fedorqui 'SO stop harming'

@fedorquiはとegrep同等でgrep -Eあり、--extended-regexp詳細はこちらのunix.stackexchange.com/a/17951/196072
omerhakanbilici


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

コメントからの説明

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

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename

15

試してください:

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

/はルートフォルダーであるため、すべてのファイルシステムを検索します。

ホームフォルダーを使用する場合:

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

現在のフォルダーを使用する場合:

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

おそらく、フォルダの違いの詳細は多くの人にとって明白ですが、初心者にとっても非常に役立ちます。+1
nilon

1
これは既存の回答に何を追加するのですか?
fedorqui 'SO stop harming' 2016

それを私の十字軍と呼びますが、単語は「ディレクトリ」です。これはWindowsではありません(とにかく 'directory'を使用していました-9xより前)。「フォルダ」と言うのをやめてください。最後のコマンドについては、 '/'さえも必要としません。
プリフタン共和国2018年

15

これがお役に立てば幸い...

grepたとえば、テキストを含むファイル内の行番号を取得するために、出力をより多くの情報を提供するためにビットを展開するには、次のようにします。

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

また、ファイルの種類が何かわかっている場合は、検索するファイルの種類の拡張子(この場合は.pasOR .dfmファイル)を指定して検索を絞り込むことができます。

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

オプションの簡単な説明:

  1. .find、現在のディレクトリから指定します。
  2. -name" *.*":すべてのファイル(-name " *.pas" -o -name " *.dfm"):*.pasOR *.dfmファイルのみ、または-o
  3. -type f ファイルを探していることを指定します
  4. -print0そして(パイプ)--nullの反対側には|重要なものがあります。ファイル名findをにgrep埋め込まれたxargsファイル名に渡し、ファイル名にスペースを含むファイル名を渡し、パスとファイル名を1つの文字列として扱うことができるようにします。各スペースで分割しないでください。

-name '*.*'あなたが言うことではありません。'file'という名前のファイルは、パターンがそれに対応しないため(.extなし)、ピックアップされません。*ただし(そうです。ファイルはさておき)。しかし、もう1つあります。すべてのファイルが必要な場合は、そもそもなぜファイル名を指定する必要があるのでしょうか。他のコメントはありません-ただし、MSの用語「フォルダー」を使用しない人がまだいることを知っておくのは良いことです(実際には、追加しないで十分と言った後、あなたが行ったわずかに間違ったステートメントを指摘したいと思います)ファイル名を使用して-'all'の場合の冗長性/無用)。
プリフタン共和国2018年

15

Simple findは便利です。~/.bashrcファイルにそれをエイリアスします:

alias ffind find / -type f | xargs grep

新しい端末を起動して発行します。

ffind 'text-to-find-here'

14

私は似たようなことをするPythonスクリプトを書きました。これは、このスクリプトを使用する方法です。

./sniff.py path pattern_to_search [file_pattern]

最初の引数はpath、再帰的に検索するディレクトリです。2番目の引数pattern_to_searchは、ファイルで検索する正規表現です。Python reライブラリで定義されている正規表現形式を使用します。このスクリプトでは、.も改行に一致します。

3番目の引数file_patternはオプションです。これは、ファイル名に対して機能する別の正規表現です。この正規表現に一致するファイルのみが考慮されます。

たとえば、拡張子の後にwordがpy含まれるPythonファイルを検索するには、次のようにします。Pool(Adaptor

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

そして出来上がり。一致したファイルのパスと一致が見つかった行番号が生成されます。複数の一致が見つかった場合、各行番号がファイル名に追加されます。


14

厳密に使用したい場合はfind、次を使用しますfind + grep

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

手順:

1. findファイルを検索する
ためgrepに使用し、2。その後、それらのすべてに対して実行します。

これによりfind、ファイルを検索することができます。

  • 特定のファイルのみを使用する-name Pattern場合に使用しgrepます。

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

それを試して、さまざまなオプションを使用findして、ファイル検索を改善または絞り込むことができます。


違いはなんですか?ファイルパスにスペースがあっても機能しますか?
Peter Mortensen

13

使用する:

grep -c Your_Pattern *

これにより、現在のディレクトリの各ファイルにパターンのコピーがいくつあるかが報告されます。


13

grepはこれを達成するための良い友達です。

grep -r <text_fo_find> <directory>

検索するテキストの大文字と小文字を区別しない場合は、次を使用します。

grep -ir <text_to_find> <directory>

私の場合、ディレクトリを指定してもどこでも検索されるようです
Pathros

@Pathrosおそらく、再帰を有効にして、指定するディレクトリを指定します。別の言い方をすると、再帰はそのように物事を変えます。
プリフタン

@Pathrosああ-、検索文字列にs がある場合は、--最初にgrep に渡します。それ以外の場合は興味深い副作用を引き起こす可能性があります!
プリフタン共和国

13

シンプルなgrepが 'rl'を使用して作成する方法に魅了されます。

grep -rl 'pattern_to_find' /path/where/to/find

-r to recursively find a file / directory inside directories..
-l to list files matching the 'pattern'

'l'を付けずに '-r'を使用すると、パターンが見つかっテキストが後に続くファイル名が表示されます

grep -r 'pattern_to_find' /path/where/to/find

それは完璧に動作します...


これはGit Bash(Windows)でも機能します
Peter Mortensen

ただし、すべてのファイルを検索する必要があることを意味します(などのファイル名またはファイル拡張子レベルのフィルターはありません.txt)。それともそれを行う方法はありますか?
Peter Mortensen

12

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

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;

1
find … -exec grep 'str' {} \;使用する場合と比べて、マイナス面しか見られません(使用する必要がある場合find)。
2016年

1
find含まれているスペースによって見つかったファイルのいずれかが存在すると、これはひどく壊れgreppingてしまいます。使用find ... -exec grep ...する必要がある場合にのみ使用してくださいfind。ただし、この場合はgrep -r ...十分です。
shalomb 2016年

1
findの結果に対してループを使用してgrepする意味は何ですか?これは不必要に複雑になります。
fedorqui 'SO stop harming'

12

ackあなたが探しているものを正確に実行するツールがあります。

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

-i大文字と小文字を区別する検索では無視できます


2
これは既存の回答に何を追加するのですか?これはすでに3年以上前に提案されました。
fedorqui 'SO stop harming' 2016

1
@fedorqui 1)配管なし!2)正規表現を使用します。3)行番号、相対パス付きのファイル名、強調表示されたテキストなどを取得します。検索後に編集すると便利です。たとえば、「vim + lineno path / file.cpp」を使用すると、不要な行に移動できます。検索フォルダーとサブフォルダーの下にある「include」または「hpp」キーワードを検索するコマンド「ack include \ | hpp」の出力を参照してください。要点がはっきりしているといいのですが。これはサンプル出力です(単純なテキストではキーワードの強調表示を表示できません)process / child.hpp 11:boost / process / child.hpp process / all.hpp 21:#include <boost / process / execute.hpp>
パル

12

以前のすべての回答は、grepとfindを提案しています。しかし、別の方法があります:Midnight Commanderを使用してください

それはGUIではなく視覚的な無料のユーティリティ(30歳、時間によって証明された)です。たくさんの機能があり、ファイルの検索はその1つにすぎません。


レンジャーは同じ考えになるだろう
nilon '07

11

以下のコマンドは、このアプローチで正常に機能します。

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

2
使用のポイント何でfind当時とはgrep -r?それらは同じものを意味するので、これは冗長です。
fedorqui 'SO stop harming' 15/12/23

おお!修正済み、実際には、フィルタリングされたファイルでgrepを実行するためのものであり、すべてではありません。おかげで
Pradeep Goswami 2015

2
それでも、これは意味がありませんfind。でフィルタリングできます。
fedorqui「SO害をやめる」

11

面倒を避け、ack-grepをインストールしてください。それは多くの許可と見積りの問題を排除します。

apt-get install ack-grep

次に、検索するディレクトリに移動して、以下のコマンドを実行します

cd /
ack-grep "find my keyword"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.