Jak mogę znaleźć każdy plik i katalog pasujący do wzorca, z wyłączeniem jednego katalogu używającego find
?
Powiedzmy, że mam następującą strukturę plików;
. foo-exclude-me / foo.txt foo-exclude-me-not / foo.txt bar/ foo.txt foobar / bar.txt foofoo.txt
jak mogę uzyskać następujące dane wyjściowe za pomocą find
:
./bar/foo.txt ./bar/foobar ./bar/foobar/foofoo.txt ./foo-exclude-me-not ./foo-exclude-me-not/foo.txt
Próbowałem użyć obu poniższych poleceń:
odnaleźć . -nazwa „foo-exclude-me” -prune -o -nazwa „foo *” odnaleźć . -nazwa „foo *” \! -path './foo-exclude-me/*'
ale obaj zwracają to:
./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt
Jak mogę poprawnie wykluczyć foo-exclude-me
katalog?
foo-exclude-me
zamiast./foo-exclude-me
. Spróbuj także dołączyć-print
na końcu polecenia.-print
ifoo-exclude-me
zamiast./foo-exclude-me
.Odpowiedzi:
Jeśli nie
-print
, domyślna domyślna akcja dotyczy każdego dopasowania, nawet przyciętego. Wyraźne-print
stosuje się tylko pod określonymi warunkami, które są-name 'foo*'
tylko w gałęzi else w-name 'foo-exclude-me'
.Ogólnie rzecz biorąc, używaj wyrażenia,
-print
gdy robisz coś bardziej złożonego niż połączenie predykatów.Druga próba z
! -path './foo-exclude-me/*'
nie zadziałała, ponieważ./foo-exclude-me
nie pasuje./foo-exclude-me/*
(brak końcowego/
). Dodawanie! -path ./foo-exclude-me
działałoby.źródło
źródło
-prune
jest to istotne.-prune
jest jedną z najbardziej skomplikowanych opcjifind
powodujących, że powoduje wyłączenie-print
(która jest domyślnie włączona)