- голые решения -
Если вы хотите findпропустить содержимое найденного каталога, но продолжить поиск в других каталогах, используйте -pruneкак предложено @laebshade. Полная команда должна выглядеть так
find . -type d -name somename -prune -exec ...
С другой стороны, если вы хотите , findчтобы полностью прекратить поиск и после нахождения первого каталога соответствия, то , что вы ищете -quit(начиная с версии 4.2.3о GNU find). Этот вариант немного сложнее в использовании, потому что он findнемедленно завершает работу, поэтому его -quitнужно поместить в самый конец команды:
find . -type d -name somename -exec ... -quit
Для того, чтобы это работало, как и ожидалось, нужно убедиться, что -execвозвращается true (другими словами, нулевой статус). Если вы хотите, чтобы статус выхода -execигнорировался, чтобы он -quitвсегда работал, вам понадобится небольшой трюк:
find . -type d -name somename \( -exec ... -o -true \) -quit
или
find . -type d -name somename \( -exec ... -o -quit \)
или
find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
- некоторые объяснения -
Самая важная вещь о том, как findработает, состоит в том, что все действия («тесты») рассматриваются как логические предикаты, интерпретируемые слева направо. Поэтому последнее действие (например -quit) будет выполнено только в том случае, если вся предыдущая часть не вернула false . По умолчанию все тесты объединяются с логическим «И», -oопция меняет соединение на «ИЛИ».
Хитрый элемент в -oтом, что findможет "оптимизировать" вашу команду и не запускать -execчасть, если вы просто наберете
find . -type d -name somename -exec ... -o -quit
Чтобы справиться с этим, вы можете принудительно findоценить все предикаты, обозначенные «ИЛИ», заключив их в круглые скобки.