- gołe rozwiązania -
Jeśli chcesz findpominąć zawartość znalezionego katalogu, ale kontynuować wyszukiwanie w innych katalogach, użyj -prunejako sugerowanego @laebshade. Pełne polecenie powinno wtedy wyglądać
find . -type d -name somename -prune -exec ...
Z drugiej strony, jeśli chcesz find, aby całkowicie zatrzymać wyszukiwanie i po znalezieniu pierwszego pasującego katalogu, to co szukasz jest -quit(dostępny od wersji 4.2.3z GNU find). Ten jest nieco trudniejszy w użyciu, ponieważ powoduje findnatychmiastowe wyjście - dlatego -quitnależy go umieścić na samym końcu polecenia:
find . -type d -name somename -exec ... -quit
Aby działało to zgodnie z oczekiwaniami, należy upewnić się, że -execzwracane są wartości true (innymi słowy, zero ). Jeśli chcesz, aby status wyjścia -execbył ignorowany, aby -quitzawsze działało, potrzebujesz małej sztuczki:
find . -type d -name somename \( -exec ... -o -true \) -quit
lub
find . -type d -name somename \( -exec ... -o -quit \)
lub
find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
- jakieś wyjaśnienie -
Najważniejsze w tym, jak finddziała, jest to, że wszystkie działania („testy”) są traktowane jako logiczne predykaty interpretowane od lewej do prawej. Dlatego ostatnia akcja (na przykład -quit) zostanie wykonana tylko wtedy, gdy cała poprzednia część nie zwróci wartości false . Domyślnie wszystkie testy są połączone logicznym „ORAZ”, -oopcja zmienia połączenie na „LUB”.
Trudnym elementem -ojest to, że findmoże „zoptymalizować” twoje polecenie i nie uruchamiać -execczęści, jeśli tylko wpiszesz
find . -type d -name somename -exec ... -o -quit
Aby sobie z tym poradzić, możesz zmusić finddo oceny wszystkich predykatów powiązanych z „LUB”, umieszczając je w nawiasach.