- gołe rozwiązania -
Jeśli chcesz find
pominąć zawartość znalezionego katalogu, ale kontynuować wyszukiwanie w innych katalogach, użyj -prune
jako 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.3
z GNU find
). Ten jest nieco trudniejszy w użyciu, ponieważ powoduje find
natychmiastowe wyjście - dlatego -quit
należ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 -exec
zwracane są wartości true (innymi słowy, zero ). Jeśli chcesz, aby status wyjścia -exec
był ignorowany, aby -quit
zawsze 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 find
dział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”, -o
opcja zmienia połączenie na „LUB”.
Trudnym elementem -o
jest to, że find
może „zoptymalizować” twoje polecenie i nie uruchamiać -exec
części, jeśli tylko wpiszesz
find . -type d -name somename -exec ... -o -quit
Aby sobie z tym poradzić, możesz zmusić find
do oceny wszystkich predykatów powiązanych z „LUB”, umieszczając je w nawiasach.