web-dev-qa-db-ja.com

検索| grepはCygwinでは機能しません

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

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

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

$ grep foo bar
4
jcubic

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

Findをxargsにパイプすることもでき、 "標準入力からコマンドラインを構築して実行する"のようになります。

$ find . | xargs grep foo

改行などを含むクレイジーなファイル名がある場合は、次の方が適しています。

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

-type fは通常のファイルのみを検索するため、.または..、あるいはディレクトリや「面白い」ファイルをgrepしようとはしません。

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

次に、ファイル名のリストをstdinのgrepに渡します。リストはテキストとして扱われ、fooが検索されます。

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

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

grep -R foo somefolder/
9
squareborg

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

$ 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

参考文献

  • Linux用のBashコマンドラインのA-Zインデックス -Bashコマンドラインに関連するすべてのものの優れたリファレンス。
  • find -フォルダ階層で、名前、サイズ、ファイルタイプなどの目的の条件を満たすファイル名を検索します。
  • grep -ファイルで特定のテキストを検索します。
2
DavidPostill

これが欲しいと思います。

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

ディレクトリや特別なファイルではなく、grepファイルのみが必要です。/dev/nullは、grepにファイル名を表示させます。 '-name' * 'を削除することもできますが、削除すると、ドットファイルがgrepさ​​れます。

実行することもできます

grep -r foo .
0
Robert Jacobs