特定のテキスト文字列を含むすべてのファイルを検索したい。grep
コマンドは動作しますが、私は(私は私の現在のディレクトリのためにそれを行うことができますのみ)すべてのディレクトリのためにそれを使用する方法がわかりません。読んman grep
でみましたが、助けにはなりませんでした。
--include="*.C"
@Lekensteynのおかげで、オプション付きのワイルドカード@ user311346。
特定のテキスト文字列を含むすべてのファイルを検索したい。grep
コマンドは動作しますが、私は(私は私の現在のディレクトリのためにそれを行うことができますのみ)すべてのディレクトリのためにそれを使用する方法がわかりません。読んman grep
でみましたが、助けにはなりませんでした。
--include="*.C"
@Lekensteynのおかげで、オプション付きのワイルドカード@ user311346。
回答:
使用する方が良いでしょう
grep -rl "string" /path
どこ
-r
(または--recursive
)オプションは、のすべてのサブディレクトリも横断するために使用されますが/path
、-l
(または--files-with-matches
)オプションは、一致するファイルのファイル名のみを印刷し、一致する行は印刷しないために使用されます(これはgrep
、このオプションとの最初の一致でファイルの読み取りを停止すると、速度も向上する可能性があります)。-rlF
スイッチを使用します-F
(たとえば、正規表現ではありません)。もちろん、タスクが正規表現を使用していた場合は、すみません。確かに、-rなしの同じ理論でも、人々はgrep検索を「テキスト」と見なし、正規表現として何かを意味する特別な問題を引き起こすことがよくあります。
-i
大文字と小文字を区別しないフラグもあります。
--recursive
オプションを表示したいだけで、多くのオプションと使用シナリオがあります。私は@dmityugovから受け入れられた回答から始め、なしで動作するように修正しましたfind
。
--include '*.h'
ファイル内で一致する行を探している場合、私のお気に入りのコマンドは次のとおりです。
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
。-H
フォルダー上のファイルは、おそらく複数のファイルがある場合、冗長です。実際、manページには、-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
次のようなものを使用できると思います。
find /path -type f -exec grep -l "string" {} \;
コメントからの説明
find
は、指定されたパスのサブディレクトリ内のファイルやディレクトリやリンクなどの他のオブジェクトを検索できるコマンドです。filesnamesが満たすべきマスクを指定しない場合、すべてのディレクトリオブジェクトが列挙されます。
-type f
ディレクトリなどではなく、ファイルのみを処理することを指定します。 -exec grep
見つかったすべてのファイルについて、grepコマンドを実行し、そのファイル名を引数として{}
ファイル名に置き換えて実行することを指定します-name '*.py'
と「.py」で終わるファイルに一致が制限されます。
... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
私のデフォルトのコマンドは
grep -Rin string *
キャピトル 'R'をls
使用します。これは再帰的に使用するためです。grepは両方を受け入れるため、使用しない理由はありません。
編集:HVNSweetingに従って、明らか-R
にシンボリックリンクをたどります-r
。
shopt -s dotglob
(-s
「セット」として覚えておいてください)。ファイルを削除するときは注意してください。dotglobが有効になっている場合rm -r *
、現在のディレクトリ内のすべてが削除されますが、一致するためにその上のディレクトリも削除されます..
。dotglobを無効にするには、shopt -u dotglob
( "unset")を使用します。ただし、変更は一時的なものであり、現在のシェルにのみ適用されます。
shopt -s dotglob & <grep cmd> & shopt -y dotglob
もっと便利なだけのようなもの?このように、リセットを心配する必要はありません
grep -Rin string .
これらのケースのほとんどで使用するのがおそらく簡単です。*を使用するのは、より自然に来るようだからです。
R
、シンボリックリンクに従うことであり、r
そうではない
何か新しいことを試してみたいと思うなら、試してみてくださいack
。現在のディレクトリを再帰的に検索するコマンドstring
は次のとおりです。
ack string
インストールは非常に簡単です。
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(既にディレクトリ~/bin
を取得しており、できればにある場合PATH
)。
chmod
コマンドの最後のパラメーターは何をしますか?それらは特定のものですchmod
か、それともbash関連!#:3
ですか(部分)?
!
あるイベント指示子。繰り返しを避けるために非常に強力です。!#:3
これまでのコマンドラインの3番目のトークン、つまり~/bin/ack
この場合を参照します。
コマンド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を常に色付きで使用する方法
アップデート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;
grep
を使用するサブセットの次に、... を使用する点で似ていますが、異なるスイッチと微調整を個別の回答として受け入れる場合は、おそらく私もここに収まるでしょう。最後の更新では、検索で必要なことを実行します。検索キーと行番号を含む行を含むファイル名。読みやすくするための色付きの出力とエラーフィルターfind
grep
grep
(GNUまたはBSD)grep
ツールを使用して-r
、次のようなパラメーターを使用して現在のフォルダーを再帰的に検索できます。
grep -r "pattern" .
注:-r
-サブディレクトリを再帰的に検索します。
特定のファイル内を検索するには、次のようなグロビング構文を使用できます。
grep "class foo" **/*.c
注:グロビングオプション(**
)を使用すると、特定の拡張子またはパターンですべてのファイルが再帰的にスキャンされます。この構文を有効にするには、次を実行しますshopt -s globstar
。また**/*.*
、すべてのファイル(非表示および拡張子なし)またはその他のパターンに使用できます。
引数が長すぎるというエラーがある場合は、検索を絞り込むか、次のようなfind
構文を使用してください。
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
または、を使用しますripgrep
。
ripgrep
大きなプロジェクトや大きなファイルで作業している場合は、ripgrep
代わりに次のように使用する必要があります。
rg "pattern" .
GitHubプロジェクトページでドキュメント、インストール手順、またはソースコードをチェックアウトします。
それはのような他のツールよりもはるかに高速だGNU / BSD grep
、ucg
、ag
、sift
、ack
、pt
それは上に構築されているため、または類似の錆の正規表現エンジンは非常に高速な検索を行うために、有限オートマトン、SIMDと積極的なリテラル最適化を使用しています。
.gitignore
ファイルで指定された無視パターンをサポートしているため、単一のファイルパスを複数のグロブパターンと同時に照合できます。
次のような共通パラメーターを使用できます。
-i
-インセンシティブ検索。-I
-バイナリファイルを無視します。-w
-単語全体を検索します(部分的な単語一致の反対)。-n
-試合の行を表示します。-C
/ --context
(例-C5
)-コンテキストを増やすため、周囲のコードが表示されます。--color=auto
-一致するテキストをマークアップします。-H
-テキストが見つかったファイル名を表示します。-c
-一致する行の数を表示します。と組み合わせることができます-H
。私はこれを非常に過小評価されているコマンドであるxargsを使用して行います
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./は、現在のフォルダー内のすべてのファイルの再帰的なリストを提供し、それらを各ファイルでgrepコマンドを実行するxargsにパイプします
xargs
なしで使用する ことは非推奨であり、スペースを含むファイル名では失敗します。-print0
find
-0
xargs
ここにはたくさんの答えがあることは知っていますが、ファイルを検索するときに他の制限を追加したい場合の代替案があります:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
これgrep
は、結果が見つかった場合は0を返し、それ以外の場合は1を返すため、機能します。たとえば、1 MBのサイズで何かを含むファイルを見つけることができます。
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
複数の要件については、おそらく-O
GNU grepに存在するオプティマイザーフラグを使用する必要があります。