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