grepを使用してフォルダー内の単語を検索するにはどうすればよいですか?


542

Windowsでは、フォルダー内の単語を見つけるために検索を実行しました。同様に、特定の単語が多数のサブディレクトリとファイルを含むディレクトリ内に出現するかどうかを知りたいです。grep構文を検索したところ、ファイル名を指定する必要があることがわかりましたgrep string filename

さて、ファイル名がわかりません。どうすればよいですか。友人から提案されましたがgrep -nr string、これが何を意味するのかわからず、結果も得られませんでした(を発行するまで応答がありませんctrl + c)。

回答:


849
grep -nr 'yourString*' .

末尾のドットは、現在のディレクトリを検索します。各パラメーターの意味:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' .MobileAppServlet.javaまたはor MobileAppServlet.classまたはMobileAppServlet.txt; 'MobileAppASer*.*'は同じことを行う別の方法です。)

他のパラメータを確認するには、man grepコマンドを使用します。


14
何のビジネス*ですか?シェルのワイルドカード展開(ワイルドカードパターンに一致するファイル名がある場合)が発生するか、またはgrepはそれをの前の文字の0以上の繰り返し演算子として扱います*
usta 2013年

7
今のところのは、両方の可能性を考えてみましょうgrep -nr MobileAppSer* .1.私たちは、現在のディレクトリマッチングにおける3つのファイルがあるとしMobileAppSer*、ワイルドカードパターンを:名前のMobileAppServlet.javaMobileAppServlet.classMobileAppServlet.txt。次に、次のgrepように呼び出されます:grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .。これは、ファイル「MobileAppServlet.java」、「MobileAppServlet.txt」、および現在のディレクトリの他の場所で「MobileAppServlet.class」というテキストを検索することを意味します。これは、ユーザーがここで望んでいることとは異なります。
usta 2013年

7
2. MobileAppSer*ワイルドカードパターンに一致するファイルが現在のディレクトリにない場合はgrep、引数をMobileAppSer*そのまま受け取るため、テキスト「MobileAppSe」とそれに続く「r」の0回以上の出現を検索するものと見なされるため、現在のディレクトリのファイルコンテンツで、テキスト「MobileAppSe」、「MobileAppSer」、「MobileAppSerr」、「MobileAppSerrr」などを見つけようとします-ユーザーが望んでいるものではありません。
usta 2013年

5
これは正規表現の疑わしい選択です。Ustaはこれを指摘しました。
やや簡単

117
grep -nr string my_directory

追記:grep [options] string filenameUnixライクなシステムでは、ディレクトリは一種のファイルであるため、これは構文を満たします(Windowsでは単に「ファイル」と呼ばれるエンティティを具体的に指す「通常のファイル」という用語があります)。

grep -nr string 検索するコンテンツを標準入力から読み取ります。そのため、ユーザーからの入力を待ち、^ Cを押すと停止します(^ Dでも停止します。これは、End-ofのキーの組み合わせです) -ファイル)。


1
ねえ、それで、大文字小文字を区別せずに文字列を検索したい場合は、次のようにする必要があります:grep -i -nr "my word"。
kiki

2
@kiki:はい、これは次と同等ですgrep -inr "my word" .
usta

16
@kiki:-rgrepは、サブディレクトリを再帰的に検索-nすることを意味し、出力の各行の先頭に、その行を含むファイルの対応する行番号を付けます。man grepこのすべてについて説明します。
usta

62

GREP:グローバル正規表現の印刷/パーサー/プロセッサ/プログラム。
これを使用して、現在のディレクトリを検索できます。
「再帰的」には-Rを指定できます。これは、プログラムがすべてのサブフォルダーとそのサブフォルダー、およびそれらのサブフォルダーのサブフォルダーなどを検索することを意味します。

grep -R "your word" .

-nファイル内で一致した行番号を出力します。
-i大文字と小文字を区別せずに検索します(大文字/非大文字)。

grep -inR "your regex pattern" .

3
./*は現在のディレクトリ内のすべてのファイルを意味し、-Rは再帰的(サブディレクトリの検索など)を意味します
Stefan Steiger

25
grep -nr search_string search_dir

search_stringに対してRECURSIVE(ディレクトリとそのすべてのサブディレクトリを意味します)検索を実行します。(ustaが正しく答えたように)。

友達の提案で回答が得られなかった理由:

grep -nr string

ディレクトリが指定されていないためです。検索を行うディレクトリにいる場合は、次のことを行う必要があります。

grep -nr string .

「。」を含めることが重要です。これは、grepにこのディレクトリを検索するように指示するためです。


こんにちは、2つの単語の間にスペースを入れて検索する必要がある場合はどうすればよいですか?単語は引用符で囲んで指定する必要がありますか?つまり、grep -nr "my word"です。
kiki

24

またあります:

find directory_name -type f -print0 | xargs -0 grep -li word

しかし、それは初心者には少し多すぎるかもしれません。

find汎用のディレクトリウォーカー/リスターであり、-type f「ディレクトリと名前付きパイプではなくプレーンファイルを探して何を持っているか」を-print0意味し、「区切り文字としてnull文字を使用して標準出力に出力する」ことを意味します。からの出力findはに送信されxargs -0、(コマンドラインの長さの制限を回避するために)標準入力を(標準の改行ではなく)レコード区切り文字として使用してチャンクで取得し、grep -li wordを各ファイルセットに適用します。ではgrep-l「一致するファイルをリストする」ことを-i意味し、「大文字と小文字を区別しない」ことを意味します。通常は1文字のオプションを組み合わせることができるため、-liより頻繁に表示されます-l -i

使用しない-print0-0、スペースを含むファイル名で問題が発生するため、それらを使用することをお勧めします。


1
@mmmshuddup:ありがとう。特に初心者と一緒に仕事をしているときは、答えの一部として説明をしないと気分が悪くなります。
muは短すぎます

1
それがこのサイトで私が最も高く評価するようになったものです。私たち全員が一度は初心者であり、テクノロジーの世界に登場するのは容易ではないことを覚えておくことが重要です。
はい、バリー

特定のディレクトリを除外できますか?@muistooshort
Ferologics

@Ferologics必要がman findありますfind。コマンドラインから、サポートされているオプションを確認してください。
muが短すぎる

8

サブディレクトリ内のすべてのインスタンスを見つけるために再帰検索をしないのはなぜですか。

grep -r 'text' *

これは魅力のように機能します。


1
スペースのような特別な文字を含まない検索文字列を引用する必要はありません
Scott Stensland、

5
  1. grep -r "yourstring" * すべてのファイルとフォルダで「yourstring」を検索します

ここで、2つの異なる文字列を同時に検索する場合は、常にオプションEを使用して、検索に単語を追加できます。休憩後の例

  1. grep -rE "yourstring|yourotherstring|$" *yourstringまたはyourotherstring一致するリストの場所を検索します

4

私が使用したい別のオプション:

find folder_name -type f -exec grep your_text  {} \;

-type fは、ファイルではなくフォルダーのみを返します

-execおよび{}は、検索で見つかったファイルに対してgrepを実行します(正確な構文は "-exec command {}"です)。


4
grep -R "string" /directory/

-rが従わない場合、-Rはシンボリックリンクもたどります。


2

選択した答えは問題なく機能しますが、次の理由により、正しい方法ではありません。

grep -nr yourString* .

これは実際には文字列"yourStrin"を検索し、"g"0回以上検索します。

したがって、適切な方法は次のとおりです。

grep -nr \w*yourString\w* .

このコマンドは、現在のフォルダーで前後の任意の文字を含む文字列を検索します。


2
しかしgrep -nr yourString、それは裸を探して、あまりにも働くyourString行のどこか(あるいは、それは私のシステム、OSXライオンの上にいた少なくとも)
theheadofabroom


1

ディレクトリ内で次のコマンドを実行(端末)します。サブディレクトリ内も再帰的にチェックします。

grep -r 'your string goes here' * 

0

次のサンプルを再帰的に探しyour search string*.xml*.jsフォルダ内のファイル位置どこかpath1path2path3

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

したがって、最後にパスを指定するだけで、ファイルのサブセットで多くのディレクトリを検索できます。


-4

grepを使用しないでください。Silver Searcherまたはripgrepをダウンロードしてください。どちらも優れており、grepや大量のオプションを使用したackよりもはるかに高速です。


2
これらはおそらく素晴らしいツールですが、OPが求めていることを達成するためにこれらのツールをどのように使用するかについては答えていません。
jmathew 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.