2008-09-15 4 views
56

私は2つの異なる実行可能ファイルを使用してディレクトリ内のファイルの束を処理するfindコマンドを構築しようとしています。残念ながら、findで-execはパイプを使用できません。あるいは、\|さえもシェルはその文字を最初に解釈するためです。ここで検索コマンドにexecパラメータのパイプを使用するにはどうすればよいですか?

は、私は(パイプは、findコマンドを終了しているため動作しません)何をしようとしている、具体的である:

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

答えて

57

はまた、あなたがshスクリプト内でご使用のexec文を埋め込もうと、次に行うことができ、この

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

をお試しください:-exec

find -exec some_script {} \; 
+1

@マーティン:ありがとうございました@Martin:あなたは "-print"の最後に "123"の最後に、そして最後の "\;"の最後にアポストロフィを入れました。必要ない。 – tzot

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を置きます。

+0

私は仕事のために-printが必要なので、これはうまくいきません。 grepが成功した場合、findはファイル名を出力し、そうでない場合は出力しません。 – hoyhoy

+0

これは私のために働いた、提案のために – Arturski

3

をあなたが唯一のいくつかの引数を持つ単一の実行可能ファイルを実行することができ、任意のシェルコマンドではありません。これを回避するには、sh -c '<shell command>'を使用できます。

-execの使用は非常に非効率的であることに注意してください。見つかったファイルごとに、コマンドを再度実行する必要があります。あなたがこれを避けることができれば、より効率的です。 (例えば、xargsfindの結果を-exec外部grepの移動や配管によってPalminによって示唆されるように。)

+0

これは問題ありません。しかし、私は、-execの効率性についての私のコメントも注目に値すると思います。 – mweerden

+0

一般的なケースで複数のプロセスの非効率性を回避する別の方法は、xargsを使用することです。別々のプロセスが必要な場合は、-iオプションを使用できます。私はUnixモデルに合わせてxargsを見つけました。 –

+0

AOL on xargsを使用してください。おそらくxargsの存在を考慮して最後の段落を変更する必要があります。また、 'find'と' xargs'の両方に存在する-0フラグに注意してください。 – tzot

11

Aわずかに異なるアプローチがxargsの使用するであろう:

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

Iが常に見出さ(print0と-0引数は空白を含むファイル名に対処するために必要です)

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

+0

ここでxargsを使用する際の問題は、一致するファイルの名前が必要なことです。このコマンドは一致を見つけますが、どのファイルが一致したのかわかりません。 – hoyhoy

3

findコマンドをこのタイプのタスクに使用することは、おそらく最良の選択肢ではありません。私は、要求された情報を含むファイルを見つけるために頻繁に次のコマンドを使用します。

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done 
0

あり、あなたがそれを行うことができます別の方法の一種であるが、それはまた、かなりゲットーです。

シェルオプションextquoteを使用すると、execのものを見つけてshにパイプするために、これと似たようなことができます。

[email protected] findtest # find -type f -exec echo ls $"|" cat \;|sh 
filename 


[email protected] findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh 
h 

私はちょうど私が私がそれを視覚化し、少なくともやり方ので、それは幹部の中にパイプを使用してのOPの元の質問に近かったことを追加したい考え出しました。

関連する問題