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нестандартный предикат, который можно использовать вместо него, но я бы не назвал это «более эффективным».

Связанный контент