find -exec não faz o que a saída find sugere

find -exec não faz o que a saída find sugere

Se eu fizer isso find:

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

então consigo o que espero em 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
...

Se eu adicionar uma -execcláusula para vincular os arquivos encontrados:

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

então apenas liga os BRIKs:

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

Questões

  • O que está acontecendo?
  • Existe uma maneira mais eficiente de dizer ao find para retornar .HEAD e .BRIK usando uma única expressão curinga? Eu tentei coisas como:

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

    mas não consegui fazê-lo funcionar.

Responder1

Pergunta 1: O que está acontecendo?

Você -oestá dividindo seus argumentos. O -execsó é executado se o material do mesmo lado for -obem-sucedido (o -path "*amblock/stats.*BRIK"). Se quiser -execexecutar em ambas as condições, você precisa colocá-las entre parênteses:

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

 

Pergunta 2: Existe uma maneira mais eficiente de dizer ao find para retornar .HEAD e .BRIK usando uma única expressão curinga?

Não, mais ou menos. Algumas findimplementações têm um -regexpredicado não padrão que você poderia usar, mas eu não chamaria isso de "mais eficiente".

informação relacionada