Cygwin では Find | grep が機能しない

Cygwin では Find | grep が機能しない

Cygwinをインストールしていますが、このコマンドでソースコードを検索すると、ファイルにその文字列があっても何も表示されません。

$ echo foo > bar
$ find . -name '*' | grep foo

何も表示されません。このコマンドは GNU+Linux では正常に動作します。

$ grep foo bar

答え1

前述のように、find は見つかったファイルのリストを stdout に出力し、grep は通常、このように呼び出された場合、stdout を検索することを想定しています。

パイプ検索を に行うxargsこともできます。標準入力からコマンドラインを構築して実行する「」のように

$ find . | xargs grep foo

改行文字などが入った奇妙なファイル名の場合は、次の方が良いでしょう:

$ find . -type f -print0 | xargs -0 grep foo

通常のファイルのみが-type f検索されるため、ディレクトリや「奇妙な」ファイルに対して grep を実行することはありません。...

答え2

find . -name  '*' # This will produce a list of *file names*

次にファイル名のリストをgrepstdinに渡すと、リストはテキストとして扱われ、foo

ファイル名がないfooので何も返されません。

ファイル内のテキストを再帰的に検索するには、次のようにします。

grep -R foo somefolder/

答え3

このコマンドでソースコードを検索しても何も表示されない

$ echo foo > bar
$ find . -name '*' | grep foo

find希望する条件を満たすファイル名を検索します: 名前、サイズ、ファイルタイプ、一致するファイル名のリストを返します。コンテンツ一致するファイルの。

ファイル名のリストがgrepパイプ演算子を使用して渡されると、grep文字列bar(ファイル名)が表示され、ない foo(ファイルの内容bar)。

grepしたがって、一致するものが見つからないため、何も出力されません。

注記:

  • grepfindファイルを直接検索できます。 . パイプを使用する必要はなく|xargs別の回答で提案されているようにする必要もありません。

次のコマンドは Cygwin で動作します:

grep --exclude-dir=* "foo" ./*

例:

DavidPostill@Hal /f/test
$ cat bar
foo

DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo

参考文献

答え4

あなたはこれを望んでいると思います。

find . -name '*' -type f -exec grep foo /dev/null {} \;

ディレクトリや特殊ファイルではなく、ファイルのみを grep したい場合。/dev/null により、grep はファイル名を表示します。'-name '*' を削除したい場合もありますが、削除するとドット ファイルが grep されます。

実行することもできます

grep -r foo .

関連情報