find -exec は find の出力が示唆する動作を実行しません

find -exec は find の出力が示唆する動作を実行しません

これをやるとfind

find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK"

すると、STDOUT に期待どおりの結果が出力されます。

tp101.day1.dc.results/amblock/stats.tp101_day1+tlrc.HEAD
tp101.day1.dc.results/amblock/stats.tp101_day1+tlrc.BRIK
tp101.day2.dc.results/amblock/stats.tp101_day2+tlrc.HEAD
tp101.day2.dc.results/amblock/stats.tp101_day2+tlrc.BRIK
...

-exec見つかったファイルをリンクする句を追加する場合:

find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK" -exec ln -s {} ${TRIADS_GROUP} \;

BRIK のみがリンクされます。

stats.tp101_day1+tlrc.BRIK@
stats.tp101_day2+tlrc.BRIK@
...

質問

  • 何が起こっていますか?
  • 単一のワイルドカード式を使用して find に .HEAD と .BRIK を返すように指示するより効率的な方法はありますか? 次のようなことを試しました:

    find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*{HEAD,BRIK}"
    

    しかし、動作させることができませんでした。

答え1

質問1: 何が起こっているのですか?

-o引数を分割しています。 は-exec、 の同じ側の内容-o( -path "*amblock/stats.*BRIK") が成功した場合にのみ実行されます。 両方の条件で実行する場合は-exec、それらを括弧で囲む必要があります。

find ${TRIADS_DIR}/*.dc.results \( -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK" \) -exec ln -s {} ${TRIADS_GROUP} \;

 

質問 2: 単一のワイルドカード式を使用して、find に .HEAD と .BRIK を返すように指示するより効率的な方法はありますか?

いいえ、ちょっと違います。一部のfind実装では、-regex代わりに使用できる非標準の述語がありますが、それを「より効率的」と呼ぶことはできません。

関連情報