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

2
    

Esta pergunta já tem uma resposta aqui:

    

Se eu fizer isso find :

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

então eu recebo o que eu espero no 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 cláusula -exec para vincular os arquivos encontrados:

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

só vincula os BRIKs:

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

Perguntas

  • 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 conseguiu fazê-lo funcionar.

por shanusmagnus 25.06.2014 / 17:37

1 resposta

3

Pergunta 1: O que está acontecendo?

Seu -o está dividindo seus argumentos. O -exec só será executado se o material do mesmo lado do -o for bem-sucedido (o -path "*amblock/stats.*BRIK" ). Se você quiser que -exec seja executado nas duas condições, será necessário envolvê-los 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, tipo. Algumas implementações find têm um predicado -regex não padrão que você poderia usar em vez disso, mas eu não chamaria isso de "mais eficiente".

    
por 25.06.2014 / 17:49

Tags