find . -type f -print -exec cat {} \; | grep some string
上記のコマンドは、ファイルパスを出力しません。
私は使用しています:Ubuntu, bash 4
。
ack
現在のディレクトリの下のすべてのファイルをgrepするために使用したい場合があります。特定のファイルタイプのみでフィルタリングすることもできます。
find . -type f -print -exec cat {} \; | grep some string
上記のコマンドは、ファイルパスを出力しません。
私は使用しています:Ubuntu, bash 4
。
ack
現在のディレクトリの下のすべてのファイルをgrepするために使用したい場合があります。特定のファイルタイプのみでフィルタリングすることもできます。
回答:
それは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"
sed '...' $(find ... | xargs grep -l ...)
私が使う
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
-n
、行番号が必要な場合。+1で簡単に回答できます。
複雑なフォルダー構造でソースコードを検索することがよくあります。
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バイトです(その他のオプションを参照)。
私は〜を好みました
| ファイルを見つける| grep ontでファイルを見つける| ファイルの完全なパスを表示する
find / -type f -exec grep 'some string' {} \; -exec echo {} \;
Silver Searcherは、ファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。
問題を解決するには、シルバーサーチャーコマンドは次のようになります...
ag 'some string' -l
-l
一致するものを含むファイル名のみを印刷します(一致する行を印刷しません)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string