web-dev-qa-db-ja.com

Linuxで特定のテキストを含むすべてのファイルを見つける方法は?

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

私がこれを行う方法を調べていたとき、私は二度この解決策に出会いました:

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

しかし、うまくいきません。システム内のすべての単一ファイルを表示するようです。

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

4457
Nathan

以下をせよ:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -rまたは-Rは再帰的です。
  • -nは行番号です。
  • -wはWord全体に一致することを表します。
  • 一致するファイルのファイル名を指定するためだけに-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パラメータを介して特定のディレクトリを除外することが可能です。たとえば、これはdir dir1 /、dir2 /、および* .dst /に一致するすべてのdirを除外します。

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

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

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

8076
rakib_

grep -ilRを使うことができます:

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

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

ただやる:

ack 'text-to-find-here'

ルートディレクトリ。

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


UPDATE

The Silver Searcher を発見しました。これはackに似ていますが、3-5倍高速で、.gitignoreファイルのパターンさえ無視します。

297
EarlOfEgo

あなたが使用することができます:

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//// /へのパス -r:再帰的検索 n:行番号は一致のために表示されます

156
learner_19

これを使うことができます:

grep -inr "Text" folder/to/be/searched/
98
A R

与えられたテキストを含むファイル名のリスト

まず第一に、私はあなたが-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$ 

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

"text" vs "TEXT"のように大文字小文字を区別しなくても、大文字小文字を無視するために-iスイッチを使用できます。あなたはさらなる詳細を読むことができます ここ

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

59
lkamal

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

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

find -execのフォーマットより覚えやすいと思います。

これはファイル名とマッチした行の内容を出力します。

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

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

  • -i - 大文字と小文字を区別しない検索
  • -l - 一致が見つかった場所のファイル名のみを出力します
  • -h - 一致した行のみを出力します(ファイル名ではありません)
51
RobEarl
grep -insr "pattern" *
  • i:PATTERNと入力ファイルの両方で大文字と小文字の区別を無視します。
  • n:入力ファイル内で、出力の各行の先頭に1から始まる行番号を付けます。
  • s:存在しない、または読めないファイルに関するエラーメッセージを抑制します。
  • r:各ディレクトリ配下の全ファイルを再帰的に読み込みます。
38
enfinet

試してください:

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

Linuxで特定のテキストを含むすべてのファイルを見つける方法は? (...)

私はこの解決策に二度出会った。

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


例のように find を使用する場合は、grep-s--no-messages)を追加し、コマンドの最後に2>/dev/nullを追加して_(アクセス拒否grepおよびfindが発行するメッセージ)

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

find ファイルを検索するための標準ツールです。特定のテキストを探すときにgrepと組み合わせて使用​​されます - Unixライクなプラットフォームで。ちなみに find コマンドは xargs と組み合わされることがよくあります。

同じ目的のために、より速くより簡単なツールがあります - 下記を参照してください。もっと試してみてください、あなたのプラットフォームで利用可能であれば、もちろん:

より速くより簡単な代替

RipGrep - 最速の検索ツール

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

The Silver Searcher

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

ack

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

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


警告本当に避けられない場合を除き、 '/' (ルートディレクトリ) で検索しないでください。長くて効率の悪い検索を避けるためです。上記では、 ' / 'をサブディレクトリ名に置き換えた方が良いでしょう。例えば、実際に検索したい場所によっては "/ home" ...

27
Bludzee

The Silversearcherという新しいユーティリティがあります。

Sudo apt install silversearcher-ag

Gitや他のVCSと密接に連携しています。そのため、 .git や他のディレクトリには何も入りません。

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

ag -ia "Search query"

そしてそれはあなたのためのタスクを行います!

27
Neil Agarwal

pwdを使用して、自分がいるディレクトリから検索し、下方に再帰します。

grep -rnw `pwd` -e "pattern"

更新 使用しているgrepのバージョンによっては、pwdを省略することができます。新しいバージョンでは、.がディレクトリが与えられていない場合のgrepのデフォルトケースのようです:

grep -rnw -e "pattern"

または

grep -rnw "pattern"

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

26
mahatmanich

文字列を探していなくてもgrepを使うことができます。

実行しているだけ

grep -RIl "" .

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

18
Alex Jasmin

これがファイルを検索するために使用できるコマンドのいくつかのリストです。

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
16
Atul Arvind

単純なfindは便利です。 ~/.bashrcファイルでエイリアスします。

alias ffind find / -type f | xargs grep

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

ffind 'text-to-find-here'
14
danglingpointer
find /path -type f -exec grep -l "string" {} \;

コメントからの説明

findは、与えられたパスのサブディレクトリにあるファイルやディレクトリやリンクのような他のオブジェクトを見つけることができるコマンドです。ファイル名が満たすべきマスクを指定しないと、すべてのディレクトリオブジェクトが列挙されます。

-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
14
Vinod Joshi

これが助けになることを願っています...

出力の詳細情報を表示するためにgrepname__を少し拡張します。たとえば、テキストがあるファイルの行番号を取得するには、次のようにします。

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

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

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

オプションの簡単な説明

  1. findname__内の.は、現在のディレクトリから指定します。
  2. -name "*.*":すべてのファイルの場合(-name "*.pas" -o -name "*.dfm"):*.pas OR *.dfmファイル、OR -oで指定
  3. -type fは、あなたがファイルを探していることを指定します
  4. -print0(パイプ)の反対側の--null|は、findname__に埋め込まれたgrepname__からxargsname__へのファイル名の受け渡しが重要なので、grepでファイル名にパスを含めることができます。ファイル名を1つの文字列として、各スペースで分割しないでください。
14
Gert van Biljon

Silver Searcherは素晴らしいツールですが、ripgrepの方がさらに良いかもしれません。

これはLinux、Mac、Windowsで動作し、 Hacker News 2か月前に書かれました(これはAndrew Gallantのブログへのリンクで、GitHubへのリンクがあります)。

Ripgrep - 新しいコマンドライン検索ツール

14
AAAfarmclub

試してください:

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' {} \;
14
user4863663

Pythonスクリプト を書きましたが、これは似たようなことをしています。これがこのスクリプトの使い方です。

./sniff.py path pattern_to_search [file_pattern]

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

3番目の引数file_patternはオプションです。これはファイル名に作用する別の正規表現です。この正規表現に一致するファイルだけが考慮されます。

たとえば、Pool(の後にWord pyが続く拡張子Adaptorを持つPythonファイルを検索したい場合は、次のようにします。

./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 

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

13
Dilawar

つかいます:

grep -c Your_Pattern *

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

12
Dr_Hope

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

grep -r <text_fo_find> <directory>

あなたが見つけるためにテキストの大文字小文字の区別を気にしないならば、それから使用してください

grep -ir <text_to_find> <directory>
11
Prash

これまでの答えはすべてgrep and findを示唆しています。しかし、別の方法があります。 Midnight Commander を使用してください。

それはGUIではなく視覚的な無料のユーティリティ(30歳、時間によって証明されています)です。たくさんの機能があり、ファイルを見つけることもそのうちの1つです。

11
Peter M.

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

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;
11
user3124504

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

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

ack -i search_string folder_path/*

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

11
Pal

下記のコマンドは、この方法ではうまくいきます。

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

これを試して:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

Grepが 'rl'を使ってどのようにシンプルになるかに私は魅了されています。

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

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

ファイル名とそれに続く テキストが見つかるテキスト !を表示するには、 'l'を付けずに '-r'を使用します。

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

完璧に動作します。

それが役に立てば幸い!

10
nitinr708

ファイル名は不要だがすべてのファイルから検索したいので、下記のコマンドを使用できます。ここで私は "TEXT"フォームをキャプチャしていますファイル名が印刷されていないことを確認しているすべてのログファイル

grep -e TEXT *.log | cut -d' ' --complement -s -f1

-eオプション付きのgrepは、PATTERN一致用であるため、他のオプションと比較してかなり高速です。

10
Mitul Patel

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

apt-get install ack-grep

次に検索したいディレクトリに行き、以下のコマンドを実行します。

cd /
ack-grep "find my keyword"
10
Kareem

findsとxargsは、ふるいにかける候補が多数ある場合に適しています。他のオプションよりも実行速度は遅くなりますが、常に機能します。一部の人が発見したように、xargsはデフォルトで埋め込みスペースを持つファイルを処理しません。 -dオプションを指定することでこれを克服できます。

これは@ RobEarlの答えで、スペースを含むファイルを処理するように拡張されています。

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

これは@ venkatの答えで、同様に機能強化されています。

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

これは@Gert van Biljonの答えで、同様に機能強化されています。

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

これは@ LetalProgrammerの答えで、同様に機能強化されています。

alias ffind find / -type f | xargs -d '\n' grep

これは@Tayab Hussainの答えで、同様に機能強化されています。

find . | xargs -d '\n' grep 'Word' -sl
7
Mike Slinn

あなたがいつもチェックしているファイルのセットがあるなら、あなたはそれらのパスをエイリアスすることができます。

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

それからあなたは単にこのようにリストをフィルターにかけることができます:

grep -U -l $'\015' $(fd)

これは、リストfdをCRパターンを含むファイルに除外します。

私が興味を持っているファイルをエイリアスすることは私がより簡単なスクリプトを作成するのを助け、それからそれらすべてのファイルを入手する方法を常に覚えておくのに役立ちます。再帰的なものも同様に機能しますが、遅かれ早かれあなたは特定のファイルタイプを排除することと闘わなければならなくなるでしょう。私が興味を持っているすべてのファイルタイプを最初から見つけることができるのはこのためです。

7
dkinzer

厳密にfindを使いたい場合は、

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

find + grep

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

以下のように1つのコマンドにまとめることができます。

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

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

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

これはあなたにファイルを見つけるfindの力を与えることができます。あなたはそれで遊んで、あなたのファイル検索を改善するか、または絞り込むためにfindの異なるオプションを使うことができます。

7
BreakBadSP

これを試して:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

または

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
7
VIPIN KUMAR

つかいます:

grep -Erni + "text you wanna search"

このコマンドはカレントディレクトリのすべてのファイルとディレクトリを再帰的に検索して結果を表示します。

注:grep出力が色付けされていない場合は、シェルソースファイルでgrep = 'grep --color = always'エイリアスを使用して変更できます。

7
baldash

ファイルから特定のテキストを検索するには、次のコマンドを使用できます。

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

以前の回答のPeterが述べたように 、以前のすべての回答はgrep and findを示唆しています。

しかし、2001年以降、 Gnome Commander を完璧な _ gui _ と、そして多数のオプションを指定して使用する、より洗練された方法があります。それは同様に無料のユーティリティであり、時間によって証明されています。

7
Geeocode

これを試して

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6

Platinum Searcher も参照してください。これは The Silver Searcher に似ており、Goで書かれています。

例:

pt -e 'text to search'
5
Gustavo Paulo

GUI検索の代替 - デスクトップ用:

- 問題はコマンドを正確に要求していないため _

Searchmonkey :正規表現を使ってシステムにインデックスを付けなくても高度なファイル検索ツール。 find/grepと同じグラフィックです。 Linux(Gnome/KDE/Java)およびWindows(Java)で利用可能 - オープンソースGPL v3

特徴:

  • 高度な正規表現
  • 状況に応じて表示された結果
  • テキストを含む検索
  • テキストを含む行を表示するためのパネル
  • 新しい2018年アップデート
  • 等.

ダウンロード - リンク:

スクリーンショット:

Enter image description here

5
intika

あなたのコマンドは正しいです。 grepに-lを追加するだけです。

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ