find -exec no hace lo que sugiere el resultado de búsqueda

find -exec no hace lo que sugiere el resultado de búsqueda

Si hago esto find:

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

entonces obtengo lo que espero en 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
...

Si agrego una -execcláusula para vincular los archivos encontrados:

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

entonces solo vincula los BRIK:

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

Preguntas

  • ¿Lo que está sucediendo?
  • ¿Existe una forma más eficaz de indicarle a find que devuelva .HEAD y .BRIK utilizando una única expresión comodín? Probé cosas como:

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

    pero no pude hacerlo funcionar.

Respuesta1

Pregunta 1: ¿Qué está pasando?

Estás -odividiendo tus argumentos. El -execúnico se ejecuta si el material en el mismo lado -otiene éxito (el -path "*amblock/stats.*BRIK"). Si desea -execejecutar ambas condiciones, debe colocarlas entre paréntesis:

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

 

Pregunta 2: ¿Existe una forma más eficaz de indicarle a find que devuelva .HEAD y .BRIK utilizando una única expresión comodín?

No, más o menos. Algunas findimplementaciones tienen un -regexpredicado no estándar que podría usar en su lugar, pero yo no lo llamaría "más eficiente".

información relacionada