これら 3 つのコマンドは同じことを実行しますか?
grep を使用するコマンド。
grep "a" -r .
find を使用するコマンド。
find . -exec grep "a" {} \;
xargs を介して検索に grep を使用するコマンド。
find . | xargs grep "a"
答え1
それらは同じではなく、それぞれに問題があります。
- 最初のものは Gnu 拡張機能を使用しているため移植性がありません。さらに、オプションはパターンの後ではなく、パターンの前に置く必要があります。
- すでに述べたように、2 番目にはファイル名が表示されません。
- ファイル名に埋め込まれたスペースなどがある場合、3 番目の方法は失敗します。
代わりに以下を使用します:
find . -type f -exec grep a /dev/null {} +
移植性があり、通常以外のファイルは無視され、奇妙なファイル名と衝突することはなく、パターンが見つかった場合は常にファイル名が表示されます。
答え2
これは宿題の質問ですか?
試してみましたか?
やっていることは少し違います。
たとえば、grep
単一のファイル名を入力すると、出力時にファイル名がエコーされません。grep
を使用する場合、これはイライラすることがありますfind
。
答え3
「同じことを行う」という定義をもっと明確にすべきです。最初のものは1つのコマンドを実行し、2番目は1つのファイルごとに1つのfindとfork+execのgrepを実行し、3番目は最低3つのコマンドを実行します。ファイルが多すぎて1つのコマンド行に収まらない場合は、それ以上のコマンドを実行します。CPU/メモリへの影響に関しては、最も明確に次のようになります。ない同じことを行いますが、1 つのプロセス、3 つのプロセス、および「大量の」プロセスの違いは重要です。
ファイルシステムの観点から見ると、ファイルシステムが走査され、各ファイルが統計され、開かれ、完全に読み取られ、閉じられます。したがって、その観点からはすべて同じことが行われ、ファイルシステムは違いに気づきません (膨大な数のプロセスをフォークすることによるオーバーヘッドのために、2 番目のインスタンスでの走査が遅くなることはありますが)。
画面に表示される出力は異なりますが、その違いは、いくつかの異なるディレクトリ構造でコマンドを実行するだけで経験的に判断できます (1 つの明らかな方法は redgrittybrick が言及した方法です)。
異なる文字の数と構文エラーの可能性により、入力にかかる時間は異なります。
などなど。物事が「異なる」点はたくさんあります。:)