78

2 つの異なる実行可能ファイルを使用して、ディレクトリ内の一連のファイルを処理するための検索コマンドを作成しようとしています。残念ながら、シェルが最初にその文字を解釈するため 、 -execon find はパイプの使用を許可しません。\|

これが具体的に私がやろうとしていることです(パイプがfindコマンドを終了するため、これは機能しません):

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
4

6 に答える 6

88

これを試して

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

または、sh スクリプト内に exec ステートメントを埋め込んでから、次のようにすることもできます。

find -exec some_script {} \;
于 2008-09-15T09:54:10.147 に答える
15

少し異なるアプローチは、xargs を使用することです。

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

これは、理解して適応するのが少し簡単だといつも思っていました(空白を含むファイル名に対処するには、 -print0 および -0 引数が必要です)

これは、ファイルのリストを xargs にパイプし、xargs が jhead コマンドラインが長くなりすぎないようにするため、-exec を使用するよりも効果的である可能性があります (テストされていません)

于 2008-09-15T10:52:50.723 に答える
4

を使用-execすると、任意のシェル コマンドではなく、いくつかの引数を指定して単一の実行可能ファイルのみを実行できます。これを回避するには、 を使用できますsh -c '<shell command>'

-execの使用は非常に非効率的であることに注意してください。見つかったファイルごとに、コマンドを再度実行する必要があります。これを回避できればより効果的です。(たとえば、Palminによって提案されているように、 のgrep外側を移動するか、 to-execの結果をパイプすることによって。)findxargs

于 2008-09-15T09:56:30.953 に答える
3

このタイプのタスクにコマンドを使用findすることは、最良の代替手段ではない可能性があります。要求された情報を含むファイルを見つけるために、次のコマンドを頻繁に使用します。

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
于 2011-02-27T03:29:00.953 に答える
1

これはリストを出力するので、あなたはしません:

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 を適用します。

于 2008-09-15T09:52:47.797 に答える