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非标准谓词,您可以使用它来代替,但我不会称其为“更有效”。

相关内容