grep -rとここでfindの違いは何ですか?

grep -rとここでfindの違いは何ですか?

特定の文字列を見つけるためにディレクトリ内のファイルを再帰的にgrepしようとしています。私が選んだ解決策は次のとおりです。

$ find . -type f -exec grep "string to find" {} \+

...そして(他のUNIXユーザーが好きなように)grepを再帰的に使用すると、無限ループに陥るようです。

$ grep -r "string to find"

ここでfindとgrepの違いは何ですか?ところで、私はGNU grep 3.4filesystemを使用してGNU grep 2.7比較しています。GNU find 4.7.0Linux 5.4.24ext4

答え1

このgrepコマンドの場合、現在のディレクトリなどのFILEモードがありません。

$ grep -r "string to find" .

少なくとも一部のUniceのデフォルトの動作は、標準入力がないときにそれを使用することです。 From man grep:「grepは名前付き入力ファイルを検索します(ファイル名がない場合、または単一のハイフンマイナス記号(-)がファイル名として指定されている場合は標準入力を検索します...」

編集:申し訳ありません。 OPで特にこれを言及したことを確認しましたGNU grep 3.4。この動作(stdinの代わりに作業ディレクトリを使用)はv 2.7以降に変更され、それに追いついていませんでした。質問を完全に読めなかったことについての教訓として、ここに答えを残しておきます。

関連情報