私は自分のLinuxシステム全体をスキャンして、特定の文字列を含むすべてのファイルをスキャンする方法を見つけようとしています。わかりやすくするために、ファイル名ではなくファイル内のテキストを探しています。
私がこれを行う方法を調べていたとき、私は二度この解決策に出会いました:
find / -type f -exec grep -H 'text-to-find-here' {} \;
しかし、うまくいきません。システム内のすべての単一ファイルを表示するようです。
これは適切な方法に近いですか。そうでなければ、どうすればいいの?ファイル内のテキスト文字列を見つけるこの機能は、私が行っているプログラミングプロジェクトにとって非常に便利です。
以下をせよ:
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
を確認してください。
grep -ilR
を使うことができます:
grep -Ril "text-to-find-here" /
i
は大文字と小文字を区別しないことを表します(あなたの場合はオプション).R
は再帰を表します。l
は、「結果そのものではなく、ファイル名を表示する」という意味です。/
はあなたのマシンのルートから始まることを表します。ack を使用できます。これは、ソースコードの grep のようなものです。ファイルシステム全体をスキャンできます。
ただやる:
ack 'text-to-find-here'
ルートディレクトリ。
正規表現 を使用したり、ファイルタイプを指定したりすることもできます。
UPDATE
The Silver Searcher を発見しました。これはackに似ていますが、3-5倍高速で、.gitignore
ファイルのパターンさえ無視します。
あなたが使用することができます:
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:行番号は一致のために表示されます
これを使うことができます:
grep -inr "Text" folder/to/be/searched/
まず第一に、私はあなたが-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
スイッチを使用できます。あなたはさらなる詳細を読むことができます ここ 。
これがお役に立てば幸いです。
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
- 一致した行のみを出力します(ファイル名ではありません)grep -insr "pattern" *
i
:PATTERNと入力ファイルの両方で大文字と小文字の区別を無視します。n
:入力ファイル内で、出力の各行の先頭に1から始まる行番号を付けます。s
:存在しない、または読めないファイルに関するエラーメッセージを抑制します。r
:各ディレクトリ配下の全ファイルを再帰的に読み込みます。試してください:
find . -name "*.txt" | xargs grep -i "text_pattern"
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
ag 'text-to-find-here' / -l
ack :
ack 'text-to-find-here' / -l
注:これらのコマンドに2>/dev/null
を追加して、多くのエラーメッセージを隠すこともできます。
警告 :本当に避けられない場合を除き、 '/' (ルートディレクトリ) で検索しないでください。長くて効率の悪い検索を避けるためです。上記では、 ' / 'をサブディレクトリ名に置き換えた方が良いでしょう。例えば、実際に検索したい場所によっては "/ home" ...
The Silversearcherという新しいユーティリティがあります。
Sudo apt install silversearcher-ag
Gitや他のVCSと密接に連携しています。そのため、 .git や他のディレクトリには何も入りません。
あなたは単に使うことができます
ag -ia "Search query"
そしてそれはあなたのためのタスクを行います!
pwd
を使用して、自分がいるディレクトリから検索し、下方に再帰します。
grep -rnw `pwd` -e "pattern"
更新 使用しているgrepのバージョンによっては、pwd
を省略することができます。新しいバージョンでは、.
がディレクトリが与えられていない場合のgrepのデフォルトケースのようです:
grep -rnw -e "pattern"
または
grep -rnw "pattern"
上記と同じことをします!
文字列を探していなくてもgrep
を使うことができます。
実行しているだけ
grep -RIl "" .
すべてのテキストファイル、つまり印刷可能文字のみを含むテキストファイルへのパスを印刷します。
これがファイルを検索するために使用できるコマンドのいくつかのリストです。
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
単純なfind
は便利です。 ~/.bashrc
ファイルでエイリアスします。
alias ffind find / -type f | xargs grep
新しい端末を起動して発行します。
ffind 'text-to-find-here'
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
これが助けになることを願っています...
出力の詳細情報を表示するためにgrep
name__を少し拡張します。たとえば、テキストがあるファイルの行番号を取得するには、次のようにします。
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"
オプションの簡単な説明
find
name__内の.
は、現在のディレクトリから指定します。-name
"*.*
":すべてのファイルの場合(-name "*.pas
" -o -name "*.dfm
"):*.pas
OR *.dfm
ファイル、OR -o
で指定-type f
は、あなたがファイルを探していることを指定します-print0
(パイプ)の反対側の--null
と|
は、find
name__に埋め込まれたgrep
name__からxargs
name__へのファイル名の受け渡しが重要なので、grepでファイル名にパスを含めることができます。ファイル名を1つの文字列として、各スペースで分割しないでください。Silver Searcherは素晴らしいツールですが、ripgrepの方がさらに良いかもしれません。
これはLinux、Mac、Windowsで動作し、 Hacker News 2か月前に書かれました(これはAndrew Gallantのブログへのリンクで、GitHubへのリンクがあります)。
試してください:
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' {} \;
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
また、一致したファイルのパスと一致が見つかった行番号が生成されます。複数の一致が見つかった場合は、各行番号がファイル名に追加されます。
つかいます:
grep -c Your_Pattern *
これにより、現在のディレクトリの各ファイルにパターンのコピーがいくつあるかが報告されます。
grepはこれを達成するためのあなたの良い友達です。
grep -r <text_fo_find> <directory>
あなたが見つけるためにテキストの大文字小文字の区別を気にしないならば、それから使用してください
grep -ir <text_to_find> <directory>
これまでの答えはすべてgrep and findを示唆しています。しかし、別の方法があります。 Midnight Commander を使用してください。
それはGUIではなく視覚的な無料のユーティリティ(30歳、時間によって証明されています)です。たくさんの機能があり、ファイルを見つけることもそのうちの1つです。
文字列を検索し、検索文字列を含むその行だけを出力するには
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;
あなたが探しているものを正確に実行するack
ツールがあります。
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
大文字と小文字を区別する検索では-i
を無視することができます
下記のコマンドは、この方法ではうまくいきます。
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
これを試して:
find . | xargs grep 'Word' -sl
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
完璧に動作します。
それが役に立てば幸い!
ファイル名は不要だがすべてのファイルから検索したいので、下記のコマンドを使用できます。ここで私は "TEXT"フォームをキャプチャしていますファイル名が印刷されていないことを確認しているすべてのログファイル
grep -e TEXT *.log | cut -d' ' --complement -s -f1
-eオプション付きのgrepは、PATTERN一致用であるため、他のオプションと比較してかなり高速です。
面倒を避けてack-grepをインストールしてください。それは多くの許可と引用の問題を排除します。
apt-get install ack-grep
次に検索したいディレクトリに行き、以下のコマンドを実行します。
cd /
ack-grep "find my keyword"
find
sとxarg
sは、ふるいにかける候補が多数ある場合に適しています。他のオプションよりも実行速度は遅くなりますが、常に機能します。一部の人が発見したように、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
あなたがいつもチェックしているファイルのセットがあるなら、あなたはそれらのパスをエイリアスすることができます。
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
それからあなたは単にこのようにリストをフィルターにかけることができます:
grep -U -l $'\015' $(fd)
これは、リストfdをCRパターンを含むファイルに除外します。
私が興味を持っているファイルをエイリアスすることは私がより簡単なスクリプトを作成するのを助け、それからそれらすべてのファイルを入手する方法を常に覚えておくのに役立ちます。再帰的なものも同様に機能しますが、遅かれ早かれあなたは特定のファイルタイプを排除することと闘わなければならなくなるでしょう。私が興味を持っているすべてのファイルタイプを最初から見つけることができるのはこのためです。
厳密に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
の異なるオプションを使うことができます。
これを試して:
find / -type f -name "*" -exec grep -il "String_to_search" {} \;
または
for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
つかいます:
grep -Erni + "text you wanna search"
このコマンドはカレントディレクトリのすべてのファイルとディレクトリを再帰的に検索して結果を表示します。
注:grep出力が色付けされていない場合は、シェルソースファイルでgrep = 'grep --color = always'エイリアスを使用して変更できます。
ファイルから特定のテキストを検索するには、次のコマンドを使用できます。
cat file | grep 'abc' | cut -d':' -f2
以前の回答のPeterが述べたように 、以前のすべての回答はgrep and findを示唆しています。
しかし、2001年以降、 Gnome Commander を完璧な _ gui _ と、そして多数のオプションを指定して使用する、より洗練された方法があります。それは同様に無料のユーティリティであり、時間によって証明されています。
これを試して
find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
GUI検索の代替 - デスクトップ用:
- 問題はコマンドを正確に要求していないため _
Searchmonkey :正規表現を使ってシステムにインデックスを付けなくても高度なファイル検索ツール。 find/grepと同じグラフィックです。 Linux(Gnome/KDE/Java)およびWindows(Java)で利用可能 - オープンソースGPL v3
特徴:
ダウンロード - リンク:
。
スクリーンショット:
あなたのコマンドは正しいです。 grepに-lを追加するだけです。
find / -type f -exec grep -l 'text-to-find-here' {} \;