find(1)およびgrep(1)を使用して特定の文字列を含むファイルを検索する


70

find . -type f -print -exec cat {} \; | grep some string

上記のコマンドは、ファイルパスを出力しません。

私は使用しています:Ubuntu, bash 4


grepフィルターが原因で、期待どおりの結果が得られない可能性があります。これについてはどうでしょうかfind . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
。– artistoex

達成したい目標は何ですか?出力では、ファイルからgrepさ​​れた文字列を取得していますが、それらのファイルのパスが必要ですか?
ミルコブランコビッチ

はい、文字列 'some string'を含むファイルのパスを印刷したいです。@artistoexの提案では、すべてのファイルパスが出力されます。
H.Rabiee

単にack現在のディレクトリの下のすべてのファイルをgrepするために使用したい場合があります。特定のファイルタイプのみでフィルタリングすることもできます。
ヤープEldering

回答:


87

それはgrep、たまたまファイル名を含むテキストのストリームをフィードしているからです。grepの引数としてファイル名を指定しなかったため、一致した行がどのファイルから来たかを推測することは期待できません。使用xargs

find . -type f -print | xargs grep "some string"

GNU find / xargsがあるので、これはxargsがファイル名を読み取るためのより安全な方法です。

find . -type f -print0 | xargs -0 grep "some string"

一致する行を表示せずに、一致する行を持つファイル名のみが必要な場合:

find . -type f -print0 | xargs -0 grep -l "some string"

上記のコマンドを検索と置換と組み合わせるにはどうすればよいですか?同様に、grepはsedですか?
CMCDragonkai

1
見つける| grepをパイプライン出力ファイル名なので、:sed '...' $(find ... | xargs grep -l ...)
グレン・ジャックマン

107

私が使う

grep "some string" . -R

そしてそれはより速く働きます

PS

より複雑なユースケース

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

param iの説明を読むには

grep --help | grep -- -i

17
また-n、行番号が必要な場合。+1で簡単に回答できます。
チャドスキーターズ

@ChadSkeeters正確に。検索を使用しても、このような解決策は得られません。
アーチャーゴッドソン

1
正直に言うと、これは正解としてマークする必要があります。現在選択されているものは、他の何かを完全に詳述します。

12

複雑なフォルダー構造でソースコードを検索することがよくあります。

cd /your/folder/
grep -rHino "your string"

これらのパラメーターを使用してfindを使用せずに、指定されたstringを含むファイルのフルパス行番号を取得します

rHinoのように検索をBASHするので、覚えやすいです :)

これがどのように機能するかを簡単な例で示します。

catを使用してファイルのコンテンツを表示してみましょう。

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

そして、文字列「iptables -P」を含むすべてのファイルを再帰的に検索しましょう。

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

出力でわかるように、filename:hit row:searched stringがあります。

使用されるパラメーターの詳細な説明は次のとおりです。

-r各ディレクトリオペランドについて、そのディレクトリ内のすべてのファイルを再帰的に読み取り、処理します。コマンドラインでシンボリックリンクをたどりますが、再帰的に発生するシンボリックリンクはスキップします。fileオペランドが指定されていない場合、grepは作業ディレクトリを検索することに注意してください。これは、「-directories = recurse」オプションと同じです。

-i各一致のファイル名を出力します。これは、検索するファイルが複数ある場合のデフォルトです。

-n出力の各行の先頭に、入力ファイル内の1から始まる行番号を付けます。(-nはPOSIXで指定されます。)

-H各一致のファイル名を出力します。これは、検索するファイルが複数ある場合のデフォルトです。

-o一致する行の一致した(空でない)部分のみを印刷し、そのような各部分を個別の出力行に出力します。出力行は入力と同じ区切り文字を使用し、-z(--null-data)も使用されている場合、区切り文字はnullバイトです(その他のオプションを参照)。


2

私は〜を好みました

| ファイルを見つける| grep ontでファイルを見つける| ファイルの完全なパスを表示する

find / -type f -exec grep 'some string' {} \; -exec echo {} \;


0

Silver Searcherは、ファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。

問題を解決するには、シルバーサーチャーコマンドは次のようになります...

ag 'some string' -l

-l 一致するものを含むファイル名のみを印刷します(一致する行を印刷しません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.