- голые решения -
Если вы хотите 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
оценить все предикаты, обозначенные «ИЛИ», заключив их в круглые скобки.