Chcę znaleźć wszystkie katalogi z określonym ciągiem znaków, aby móc wykonać kolejne wyszukiwanie w zawartych w nich plikach.
Więc nie chcę tracić czasu na ./my-search-term/dir/my-search-term
itp.
Jak mogę zatrzymać rekursję, gdy znajdę pierwszy katalog wyszukiwanych terminów?
Odpowiedzi:
-prune
Działanie sprawia, żefind
nie recurse do katalogu. Możesz połączyć go z inną akcją, np.-exec
(Kolejność-prune
i-exec
nie ma znaczenia, o ile-prune
jest wykonywana w obu kierunkach).Zauważ, że zagnieżdżanie
find
wewnątrzfind -exec
może być nieco problematyczne: nie możesz używać-exec
wewnątrzfind
, ponieważ terminator byłby postrzegany jako terminator przez zewnętrznąfind
. Możesz obejść ten problem, wywołując powłokę, ale uważaj na cytowanie.źródło
-prune
zwraca true i może być postawione przed-exec
.-o
tam, myślę. I wydaje mi się, że stawianie-prune
wcześniej-exec
jest bardziej czytelne.-prune
opcji.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
daje błąd:find: ./x1: No such file or directory
. Rozwiązaniem jest dodanie-prune
na końcufind
polecenia.find
rozwinięcia,{}
nawet jeśli pojawia się jako podciąg argumentu do-exec
. Taka wersjafind
dusi się przy drugim poleceniu, ponieważ{}
wfind
poleceniu wewnętrznym (w poleceniu powłoki) zostanie zastąpiona nazwą katalogu znalezionego w zewnętrznymfind
. Możesz to naprawić, mówiącfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
np. Za pomocą"{"}
, w który zamieni się powłoka{}
. … (Ciąg dalszy)- 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ć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 wersji4.2.3
zGNU find
). Ten jest nieco trudniejszy w użyciu, ponieważ powodujefind
natychmiastowe wyjście - dlatego-quit
należy go umieścić na samym końcu polecenia: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:lub
lub
- 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, żefind
może „zoptymalizować” twoje polecenie i nie uruchamiać-exec
części, jeśli tylko wpiszeszAby sobie z tym poradzić, możesz zmusić
find
do oceny wszystkich predykatów powiązanych z „LUB”, umieszczając je w nawiasach.źródło