2 つの異なる実行可能ファイルを使用して、ディレクトリ内の一連のファイルを処理するための検索コマンドを作成しようとしています。残念ながら、シェルが最初にその文字を解釈するため 、 -exec
on find はパイプの使用を許可しません。\|
これが具体的に私がやろうとしていることです(パイプがfindコマンドを終了するため、これは機能しません):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
これを試して
find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print
または、sh スクリプト内に exec ステートメントを埋め込んでから、次のようにすることもできます。
find -exec some_script {} \;
少し異なるアプローチは、xargs を使用することです。
find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123
これは、理解して適応するのが少し簡単だといつも思っていました(空白を含むファイル名に対処するには、 -print0 および -0 引数が必要です)
これは、ファイルのリストを xargs にパイプし、xargs が jhead コマンドラインが長くなりすぎないようにするため、-exec を使用するよりも効果的である可能性があります (テストされていません) 。
を使用-exec
すると、任意のシェル コマンドではなく、いくつかの引数を指定して単一の実行可能ファイルのみを実行できます。これを回避するには、 を使用できますsh -c '<shell command>'
。
-exec
の使用は非常に非効率的であることに注意してください。見つかったファイルごとに、コマンドを再度実行する必要があります。これを回避できればより効果的です。(たとえば、Palminによって提案されているように、 のgrep
外側を移動するか、 to-exec
の結果をパイプすることによって。)find
xargs
このタイプのタスクにコマンドを使用find
することは、最良の代替手段ではない可能性があります。要求された情報を含むファイルを見つけるために、次のコマンドを頻繁に使用します。
for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
これはリストを出力するので、あなたはしません:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123
また
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123
find -exec の結果に grep を適用します。