Cygwinをインストールしましたが、このコマンドでソースコードを検索すると、ファイルにその文字列が含まれていても何も表示されません。
$ echo foo > bar
$ find . -name '*' | grep foo
何も表示されません。このコマンドはGNU + Linuxで正常に機能します。
$ grep foo bar
前述のように、findは見つかったファイルのリストをstdoutに出力します。通常、grepは、この方法で呼び出された場合、stdoutを検索することを想定しています。
Findをxargs
にパイプすることもでき、 "標準入力からコマンドラインを構築して実行する"のようになります。
$ find . | xargs grep foo
改行などを含むクレイジーなファイル名がある場合は、次の方が適しています。
$ find . -type f -print0 | xargs -0 grep foo
-type f
は通常のファイルのみを検索するため、.
または..
、あるいはディレクトリや「面白い」ファイルをgrepしようとはしません。
find . -name '*' # This will produce a list of *file names*
次に、ファイル名のリストをstdinのgrep
に渡します。リストはテキストとして扱われ、foo
が検索されます。
foo
のファイル名がないため、何も返されません。
ファイル内のテキストを探してファイルを再帰的に検索するには、次のように使用できます。
grep -R foo somefolder/
$ echo foo > bar
$ find . -name '*' | grep foo
find
は、名前、サイズ、ファイルタイプなどの目的の条件を満たすファイル名を検索し、一致するファイル名のリストを返します。一致するファイルのcontentsは返されません。
ファイル名のリストがパイプ演算子grep
を使用してgrep
に渡されると、文字列bar
(ファイル名)とnotfoo
(ファイルbar
の内容)。
したがって、grep
は一致するものを見つけられないため、出力するものはありません。
注意:
grep
はファイルを直接検索できます。 find
を使用する必要はありません。パイプ|
、または別の回答で提案されているxargs
。次のコマンドはCygwinで機能します。
grep --exclude-dir=* "foo" ./*
例:
DavidPostill@Hal /f/test
$ cat bar
foo
DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo
これが欲しいと思います。
find . -name '*' -type f -exec grep foo /dev/null {} \;
ディレクトリや特別なファイルではなく、grepファイルのみが必要です。/dev/nullは、grepにファイル名を表示させます。 '-name' * 'を削除することもできますが、削除すると、ドットファイルがgrepされます。
実行することもできます
grep -r foo .