QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

ある文字列を含むファイルを探す方法

横山と申します。

あるディレクトリ配下(その下のディレクトリ内も含む)のファイルの中で
『ある文字列を含むファイル』を検索する方法がわかりません。

あるディレクトリ内(その下のディレクトリ内を含まない)のファイルから
「word」を含むファイルを検索する場合は、

grep word /home/somebody/*

などとすると/home/somebody配下のファイルを検索し、検索結果として、
「一致したファイル名」と「一致した一行」が表示されます。

これを『その下のディレクトリを含む』形で検索する場合は、

find /home/somebody/ -type f -exec grep word {} \;

などとすれば良いと考えたのですが、
上のfind文では「一致したファイル名」が出力されず、
「一致した一行」のみ出力されてしまいました。

「一致したファイル名」と「一致した一行」の両方を出力するには
どうしたらよいのでしょうか?

ご存知の方がいらっしゃれば教えていただきたいと思います。
宜しくお願いします。

質問者:横山

回答

どもです。

xargs を使って

find /home/somebody/ -type f -print | xargs grep word

てのはどうでしょう?
または、

find /home/somebody/ -type f -exec grep word {} \; -exec echo {} \;

なんてベタベタな手が・・・。

投稿者:KaNi

編集 履歴 (0)

「特定の文字列を含むファイル名」が欲しいんですよね?
それでしたら、grepの返り値をチェックしないといけないのではないでしょうか。



for i in `find /path/to/dir/ -type f | xargs`;
do
    if [ "`grep word_to_find $i | wc -l`" -ne "0" ]; then
        echo $i;
    fi;
done

ってな感じでどうでしょう。grep結果の行数をwc -lで求めるというちょっと回りくどいやり方ですが、一応私の持ってるLinux(VineLinux 2.5CR + updates)ではうまく動くようですよ。

投稿者:おばけ

編集 履歴 (0)

-rで再帰的に検索してくれると思うんですが、それではだめなんでしょうか?

投稿者:とんび

編集 履歴 (0)

横山です。

KaNiさん、おばけさん、とんびさん、お返事ありがとうございます。

「-r」指定で無事求めていた結果が得られました。
(盲点でした・・・)

ありがとうございました。

投稿者:横山

編集 履歴 (0)

すでに解決されているようですが...

「一致したファイル名」と「一致した一行」の両方を出力する
ということに対しては常套手段があります。
find /home/somebody -print | xargs grep word /dev/null
です。最後の /dev/null がポイント。
必ずしも /dev/null じゃなくてもいいんですが。

投稿者:ぽんす

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。