特定のテキスト文字列を含むすべてのファイルを検索したい。 grep
コマンドは機能しますが、すべてのディレクトリで使用する方法がわかりません(現在のディレクトリでしか使用できません)。 man grep
を読んでみましたが、何の助けにもなりませんでした。
使用する方が良いでしょう
grep -rl "string" /path
どこ
-r
(または--recursive
)オプションは、/path
のすべてのサブディレクトリも走査するために使用されますが、-l
(または--files-with-matches
)オプションは、一致するファイルのファイル名のみを印刷し、一致する行は印刷しないために使用されます(これにより、grep
が最初にファイルの読み取りを停止することで、速度が向上する可能性がありますこのオプションと一致します)。ファイル内で一致する行を探している場合、私のお気に入りのコマンドは次のとおりです。
grep -Hrn 'search term' path/to/files
-H
を指定すると、ファイル名が出力されます(複数のファイルが検索される場合に暗示されます)-r
は再帰的な検索を行います-n
は、行番号を印刷しますpath/to/files
を.
にすると、現在のディレクトリを検索できます
私が非常に便利だと思うその他のオプション:
-I
バイナリファイルを無視します(補足:-a
すべてのファイルをテキストとして扱います)-F
はsearch term
を正規表現ではなくリテラルとして扱います-i
大文字と小文字を区別しない検索を行います--color=always
は、less
をパイピングするときにも色を強制します。 less
をサポート色にするには、-r
オプションを使用する必要があります。
grep -Hrn search . | less -r
--exclude-dir=dir
は、.svn
や.git
などのディレクトリを除外するのに役立ちます。次のようなものを使用できると思います。
find /path -type f -exec grep -l "string" {} \;
コメントからの説明
find
は、指定されたパスのサブディレクトリでファイルやディレクトリやリンクなどの他のオブジェクトを検索できるコマンドです。 filesnamesが満たすべきマスクを指定しない場合、すべてのディレクトリオブジェクトが列挙されます。
-type f
は、ディレクトリなどではなく、ファイルのみを処理することを指定します。-exec grep
は、見つかったすべてのファイルに対して、{}
をファイル名に置き換えて、ファイル名を引数として渡してgrepコマンドを実行することを指定します私のデフォルトのコマンドは
grep -Rin string *
ls
が再帰に使用するため、私は国会議事堂 'R'を使用します。 grepは両方を受け入れるため、使用しない理由はありません。
編集:HVNSweetingごとに、明らかに-R
はシンボリックリンクをたどりますが、-r
はそうではありません。
新しいことを試してみたい場合は、 ack
を試してみてください。 string
の現在のディレクトリを再帰的に検索するコマンドは次のとおりです。
ack string
インストールは非常に簡単です。
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(既にディレクトリ~/bin
を取得しており、PATH
にあることが望ましい場合)
コマンドrgrepはこのようなニーズ専用です
利用できない場合は、次のように取得できます
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
上記のように、デフォルトのgrepオプションに直接設定できます。
私は個人的に使用します
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
関連トピック: 色付きのrgrepを常に使用する方法
grep
( GNU または BSD )grep
ツールを使用して、次のように-r
パラメーターを使用して現在のフォルダーを再帰的に検索できます。
grep -r "pattern" .
注:-r
-サブディレクトリを再帰的に検索します。
特定のファイル内を検索するには、次のような globbing syntax を使用できます。
grep "class foo" **/*.c
注: globbing option (**
)を使用すると、特定の拡張子またはパターンですべてのファイルを再帰的にスキャンします。 この構文を有効にするには、次を実行します: shopt -s globstar
.また、すべてのファイル(非表示および拡張子なし)またはその他のパターンに**/*.*
を使用できます。
引数が長すぎるというエラーがある場合は、検索の絞り込みを検討するか、次のようなfind
構文を使用してください。
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
または、 ripgrep
を使用します。
ripgrep
大きなプロジェクトや大きなファイルで作業している場合は、代わりにripgrep
を使用する必要があります。
rg "pattern" .
GitHubプロジェクトページ でドキュメント、インストール手順、またはソースコードをチェックアウトします。
GNU / BSDgrep
のような他のツールよりもはるかに高速です。 ucg
、 ag
、 sift
、 ack
、 pt
など。 Rustの正規表現エンジン の上に構築されるため、有限オートマトン、SIMDおよび積極的なリテラル最適化を使用して非常に高速に検索します。
.gitignore
ファイルで指定された無視パターンをサポートしているため、単一のファイルパスを複数のグロブパターンと同時に照合できます。
次のような共通パラメーターを使用できます。
-i
-インセンシティブ検索。-I
-バイナリファイルを無視します。-w
-単語全体を検索します(部分的な単語一致の反対)。-n
-試合の行を表示します。-C
/--context
(例:-C5
)-コンテキストを増やすため、周囲のコードが表示されます。--color=auto
-一致するテキストをマークアップします。-H
-テキストが見つかったファイル名を表示します。-c
-一致する行の数を表示します。 -H
と組み合わせることができます。更新2:
find
およびgrep
を使用する次のコマンド行は、問題を修正します。
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
色付き出力の場合:
$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
例:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
以下のスナップショットで実行する例:
更新1:
次のコードを試すことができます。 .bashrc
または.bash_aliases
またはスクリプト内の関数として:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done }
使用法:wherein /path/to/search/in/ searchkeyword
例:
$ wherein ~/Documents/ "hello world"
(注:@enzotibによる以下のコメントで示唆されているように、これは名前にスペースを含むファイル/ディレクトリでは機能しません。)
元の投稿
文字列を検索し、検索文字列でその行だけを出力するには:
$ 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;
私はこれを非常に過小評価されているコマンドであるxargsを使用して行います
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./は、現在のフォルダー内のすべてのファイルの再帰的なリストを提供し、それらを各ファイルでgrepコマンドを実行するxargsにパイプします
ここにはたくさんの答えがあることは知っていますが、ファイルを検索するときに他の制限を追加したい場合の代替策があります:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
これは、grep
が結果を検出した場合は0を返し、そうでない場合は1を返すため、機能します。たとえば、1 MBのサイズのファイルを見つけることができますand何かを含む:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
複数の要件の場合、おそらくGNU grepに存在するオプティマイザーフラグ-O
を使用する必要があります。
C、CPPコードで検索するスクリプト(コード内検索):
#!/bin/sh
find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"
つかいます:
find-in-code "search string"