Muszę wykluczyć .git
z find
wyszukiwania. Aby to osiągnąć, używam -path ./.git -prune
przełącznika:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
Jednak nawet jeśli pomija to zawartość katalogu .git, zawiera on sam katalog. Działa, gdy dodam-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
Dlaczego jest to konieczne. Pomyślałem, że oba polecenia powinny mieć takie same wyjście. Druga składnia jest dość brzydka.
-print
, w przeciwnym razie domniemanie-print
dotyczy całego warunkuOdpowiedzi:
man
Aktualizacjafind
daje:Tak więc w pierwszym przykładzie nie jest
-path ./.git -prune
to nieprawdą i dlatego-print
nie zostanie wywołana domyślna akcja ( ), stąd wypisywana jest linia.źródło
Byłem zdezorientowany, dlaczego
find
komenda drukuje również przycięte katalogi , i kilka innych zawiłych szczegółów na temat tego, jak-prune
działało, ale udało mi się to z kilku przykładów.Aby uruchomić poniższe przykłady, utwórz następujące katalogi i pliki.
Aby utworzyć tę strukturę:
Teraz użyj find, aby wyszukać katalogi o nazwie
aa
. Tutaj nie ma problemu.Poszukaj wszystkich katalogów innych niż aa, a my otrzymamy bieżący katalog
.
i./bb
, co również ma sens.Jak dotąd tak dobrze, ale kiedy korzystamy
-prune
, find zwraca katalog, który przycinamy, co początkowo mnie zdezorientowało, ponieważ spodziewałem się, że zwróci wszystkie inne katalogi, a nie ten, który jest przycinany.Powód, dla którego zwraca przycinany katalog, został wyjaśniony nie w
-prune
sekcji stron podręcznika, jak wskazano w odpowiedzi Timo , ale wEXPRESSIONS
sekcji:co oznacza, że ponieważ wyrażenie pasuje do
aa
nazwy katalogu, to wyrażenie będzie miało wartość true i zostanie wydrukowane, ponieważ find niejawnie dodaje znak „-print
na końcu” całego polecenia. Nie doda to-print
jednak, jeśli celowo dodasz akcję-o -print
do końca:Tutaj polecenie find NIE dodaje
-print
już niejawnego , więc katalog, który przycinamy (aa
), nie zostanie wydrukowany.Wreszcie, jeśli dodamy klauzulę, która wyszukuje pliki o wzorcu nazw plików następującym
file*
po-o
, musisz umieścić-print
na końcu drugiej klauzuli w następujący sposób:Powód, dla którego to działa, jest taki sam: jeśli nie umieścisz
-print
w drugiej klauzuli, to ponieważ nie ma innej akcji niż-prune
akcja, find doda-print
automatycznie na KONIEC polecenia, powodując-prune
wydrukowanie klauzuli przycięty katalog:Ogólnie rzecz biorąc, musisz umieścić
-print
polecenie w drugiej klauzuli. Jeśli umieścisz go na środku, tak jak oryginalny plakat, nie będzie działał poprawnie, ponieważ przycinane pliki zostaną wydrukowane natychmiast, a druga klauzula nie będzie miała szansy wybrać plików, które chce:Niestety, oryginalny plakat źle podał powyższe polecenie, umieszczając go
-print
w niewłaściwym miejscu. Mogło to zadziałać w jego konkretnym przypadku, ale nie działa w przypadku ogólnym.Istnieją tysiące ludzi, którzy mają trudności ze zrozumieniem, jak
-prune
działa.find
Strona człowiek powinien być aktualizowany w celu zapobieżenia Niekończąca światową zamieszanie o tym poleceniu.źródło
find-4.6.0
podręcznika (Arch Linux ) mówi: „Jeśli całe wyrażenie nie zawiera żadnych działań innych niż -prune lub -print, -print jest wykonywane na wszystkich plikach, dla których całe wyrażenie jest prawdziwe”. Ale działa tak, jak to opisujesz.ze
man
stronyByć może możesz użyć:
To nie wyświetli
.git
katalogu.aby określić nazwę pliku, możesz wykonać następujące czynności:
Zwróć uwagę na
,
przecinek operatora.źródło
Oto szybka i brudna alternatywa:
Po prostu nie pamiętam
find
złożonej składni ...źródło