find + execコマンドの出力をパイプに送信する最良の方法は何ですか?

find + execコマンドの出力をパイプに送信する最良の方法は何ですか?

さらなる処理のために、find + execコマンドの出力をパイプに正しく送信する方法を知りたいです。

つまり、
(1)グループファイルを選択し、
(2)execを介してグループに対していくつかのタスクを実行し、
(3)そのタスクの出力をパイプライン内の1つ以上のフィルタへの入力として使用しますか?

たとえば、このようなfind + execコマンドをフィルタリングしようとすると、フィルタされた行に「信号13で終了しました」というエラーがたくさん表示されます。

$ find c* -name "*.jpg" -exec ls {} \; | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
...

この特定のエラーをこのように取り除くことはできますが、それほどエレガントに感じることはありません。

$ find c* -name "*.jpg" -exec ls {} \; -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1465856476225.jpg

find + execの一般的なケースでは、実行されるコマンドが異なる場合があります。これを行うよりエレガントな方法はありますか?

修正する
xargsを使用すると、まだstderrで出力が生成されるようです。

$ find c* -name "*.jpg" -print0 | xargs -0 ls | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
xargs: ls: terminated by signal 13

代わりに、+で終了するfind + execを使用すると、stderrに出力が生成されます。

$ find c* -name "*.jpg" -exec ls {} \+ | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13

このコマンドに「-print 2> / dev / null」を追加すると、コマンドは非常に高速に実行されますが...

$ find c* -name "*.jpg" -exec ls {} \+ -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg

ベストアンサー1

findいつ停止するのかわからないため、エラーが発生します。を実行すると、find | headheadが10行を取得して終了したときに次にfindファイル名を書き込もうとすると、次のメッセージが表示されます。信号パイプライン(パイプのもう一方の端が壊れているか閉じていることを伝えます。)findはエレガントに終了します。

しかし、ここでfindは何も書きませんlsfind子が死んでいるのを見ることができ、その理由を知っていますが、パイプのもう一方の端が閉じているという事実も知らず、子の作成を停止する方法もわかりません。

おすすめ記事