表示 - Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
linux 文字列検索 grep (20)
私は、特定の文字列を含むすべてのファイルに対して自分のLinuxシステム全体をスキャンする方法を見つけようとしています。 明確にするために、ファイル名ではなくファイル内のテキストを探しています。
私がこれを行う方法を探していたとき、私はこの解決策を二度見つけました:
find / -type f -exec grep -H 'text-to-find-here' {} \;
ただし、動作しません。 それは、システム内のすべての単一のファイルを表示するようです。
これは適切な方法に近いですか? そうでない場合、どうすればよいですか? ファイル内のテキスト文字列を見つけるこの機能は、私がやっているいくつかのプログラミングプロジェクトにとって非常に便利です。
Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか? (...)
私はこのソリューションを二度見つけました:
find / -type f -exec grep -H 'text-to-find-here' {} \;
例のようにfindを使用する場合、 grep
に-s
(-- --no-messages
)を追加し、コマンドの最後に2>/dev/null
を追加すると、 grep
とfind
によって発行されたPermission deniedメッセージがたくさん出ないようになりfind
。
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
findは、UNIXのようなプラットフォーム上でファイルを検索するための標準的なツールで、特定のテキストを探すときにgrepと組み合わせて使用します。 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"のようにサブディレクトリ名で ' / 'を置き換える方がよいでしょう。
指定されたテキストを含むファイル名のリスト
まず、 -l
代わりに-H
を使用したと思います。 また、引用符で囲んだテキストの後ろに{} \
つけてみることもできます。
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"と "TEXT"のような大文字小文字を使用していない場合でも、 -i
スイッチを使用して大文字小文字を無視することができます。 詳細はhere読むことができhere 。
これがあなたを助けることを願っています
Silver Searcherはすばらしいツールですが、ripgrepはさらに優れているかもしれません。
Linux、Mac、Windowsで動作し、数ヶ月前にHacker Newsに書かれました(Andrew GallantのBlogにGitHubリンクがあります)。
grepはこれを達成する良い友達です。
grep -r <text_fo_find> <directory>
見つかったテキストの大文字小文字を気にしない場合は、
grep -ir <text_to_find> <directory>
grep -ilR
を使うことができます:
grep -Ril "text-to-find-here" /
-
i
は大文字と小文字を区別しません(あなたの場合はオプション)。 -
R
は再帰的である。 -
l
は "結果自体ではなくファイル名を表示する"の略です。 -
/
はマシンのルートから始まります。
grep
が再帰的検索をサポートしていない場合は、 find
とxargs
組み合わせることができfind
:
find / -type f | xargs grep 'text-to-find-here'
私はfind -exec
形式よりもこれを覚えやすくしていfind -exec
。
これはファイル名とマッチした行の内容を出力します。
/home/rob/file:text-to-find-here
grep
に追加するオプションのフラグ:
-
-i
- 大文字と小文字を区別しない検索 -
-l
- 一致が見つかったファイル名のみを出力します。 -
-h
- 一致した行だけを出力します(ファイル名ではありません)
The Silversearcherという新しいユーティリティがあります
sudo apt install silversearcher-ag
これはGitや他のVCSと緊密に連携します。 だから、 .gitや別のディレクトリには何も入っていないでしょう。
あなたは単に使用することができます
ag -ia "Search query"
そしてそれはあなたのための仕事をするでしょう!
あなたが使用することができます:
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 /または/ file -r:再帰検索 n:一致する行番号が表示されます
あなたはこれを使うことができます:
grep -inr "Text" folder/to/be/searched/
これは援助の希望です...
grep
を少し拡張して出力にもっと多くの情報を与えます。例えば、テキストがあるファイル内の行番号を取得するには、次のようにします。
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
ファイルタイプが何であるかを知っていれば、検索するファイルタイプの拡張子を指定して検索を絞り込むことができます。この場合は.pas
または.dfm
ファイルになります:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
オプションの簡単な説明:
-
.
現在のディレクトリからのfind
指定に含まれていfind
。 -
-name
"*.*
":すべてのファイル(-name "*.pas
" -o -name "*.dfm
"):*.pas
OR*.dfm
ファイルのみ。 -
-type f
は、ファイルを探していることを指定します。 -
-print0
と--null
の反対側に|
(pipe)は、ファイル名をfind
からgrep
にxargs
に埋め込まれたファイル名に渡し、ファイル名にスペースを入れてファイル名を渡すことを許可し、grepがパスとファイル名を一つの文字列として扱い、それぞれのスペースでアップ。
つかいます:
grep -c Your_Pattern *
これにより、現在のディレクトリ内の各ファイルにパターンのコピーがいくつあるかが表示されます。
シンプルなfind
は便利です。 あなたの~/.bashrc
ファイルのエイリアス:
alias ffind find / -type f | xargs grep
新しい端末を起動し、次のコマンドを発行します。
ffind 'text-to-find-here'
以下のコマンドはこの方法でうまく動作します:
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
以下をせよ:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-
-r
または-R
は再帰的ですが、 -
-n
は行番号、 -
-w
は単語全体に一致します。 -
-l
(小文字のL)を追加して、一致するファイルのファイル名を与えるだけです。
これらと--include
、 --exclude-dir
--include
、 --exclude-dir
--include
、 --exclude-dir
--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
パラメータで除外することができます。 たとえば、dir1 /、dir2 /、およびそれらのすべてが* .dst /と一致するものを除外します。grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
これはあなたのようにほぼ同じ目的を達成するために私にとって非常にうまくいきます。
その他のオプションについては、 man grep
チェックしてください。
手間をかけずにack-grepをインストールしてください。 それは多くの許可と引用の問題を排除します。
apt-get install ack-grep
次に、検索するディレクトリに移動し、以下のコマンドを実行します
cd /
ack-grep "find my keyword"
文字列を探していなくてもgrep
を使うことができます。
単に走って、
grep -RIl "" .
すべてのテキストファイル、つまり印刷可能な文字だけを含むファイルへのパスを出力します。
私は単純な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
作品は完璧です..
それが役に立てば幸い!
私は同様のことをするPythonスクリプトを書いた。 これは、このスクリプトを使用する方法です。
./sniff.py path pattern_to_search [file_pattern]
最初の引数path
は、再帰的に検索するディレクトリです。 2番目の引数pattern_to_search
は、ファイル内で検索する正規表現です。 Python re
ライブラリで定義されている正規表現形式を使用します。 このスクリプトでは、 .
改行にもマッチします。
3番目の引数file_pattern
はオプションです。 これは、ファイル名で動作する別の正規表現です。 この正規表現に一致するファイルのみが考慮されます。
たとえば、 Pool(
を含むpy
という拡張子を持つ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
また、それは、マッチしたファイルのパスと一致が見つかった行番号を生成します。 複数の一致が見つかった場合は、各行番号がファイル名に追加されます。
試してください:
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' {} \;
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