web-dev-qa-db-ja.com

find(1)とgrep(1)を使って特定の文字列を含むファイルを見つける

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

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

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

60
H.Rabiee

それは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"
79
glenn jackman

私が使う

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 

私の説明を読むには

grep --help | grep -- -i
98
ArcherGodson

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

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

これらのパラメータ find を使わずに、ファイルのフルパス指定された文字列を含む行番号を取得します。

rHino :)のように検索で _ bash _ esとなるため、覚えやすいです。

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

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

出力からわかるように、 ファイル名:ヒット行:検索文字列

これは、使用されているパラメータの詳細な説明です。

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

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

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

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

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

11
Pitto

の方がよかった

|ファイルを探す| make grep ontファイルを探す|ファイルのフルパスを表示

find/-type f -exec grep 'いくつかの文字列' {} \; -exec echo {} \;

1
user515185

Silver Searcher はファイルやコンテンツを検索するためのとても速くて便利なユーティリティです。

あなたの問題を解決するために、silver searcherコマンドはこんな感じになるでしょう...

ag 'some string' -l

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

0
qoomon