find . -type d
można użyć do znalezienia wszystkich katalogów poniżej jakiegoś punktu początkowego. Ale zwraca bieżący katalog ( .
) zbyt, które mogą być niepożądane. Jak można to wykluczyć?
find . ! -path . -type d
W tym konkretnym przypadku ( .
) golfy są lepsze niż mindepth
rozwiązanie (24 vs 26 znaków), chociaż prawdopodobnie jest to nieco trudniejsze do wpisania z powodu !
.
Aby wykluczyć inne katalogi, gra będzie słabsza i wymaga zmiennej SUSZENIA:
D="long_name"
find "$D" ! -path "$D" -type d
Moje drzewo decyzyjne pomiędzy !
i -mindepth
:
!
dla przenośności..
? Rzuć monetą.long_name
? Zastosowanie -mindepth
.
find /path/ ! -path "/path/first" ! -path "/path/second"
to tylko w ten sposób?find / ! -regex '/\(a\|b\)/.*'
lub prościej, przeciągnij przez grep. Aby się nie powtórzyć, powyższe byłoby bardzo nieefektywne i powinieneś użyć-prune
: stackoverflow.com/questions/1489277/...find
z,grep
aby wykluczyć katalog, ale katalog macierzysty nadal tam był, powodując, że i tak wszystko zostało usunięte.find
, musisz sprawdzić prefiksy: stackoverflow.com/questions/17959317/… Ale Bash for loop może to obsłużyć :-)\!
), aby być po bezpiecznej stronie. Wszystkie przykłady w mojej maszynieman find
uciekły, więc wygląda na to, że to prawdopodobnie Good Idea ™. Edytuj - Właśnie zauważyłem, że nawet wyraźnie mówi:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Parametr
find
może kontrolować nie tylko głębokość rekurencji-maxdepth
, ale także ograniczać głębokość od „góry” za pomocą odpowiedniego-mindepth
parametru. Więc tak naprawdę potrzebujemy:źródło
find . -mindepth 1 -maxdepth 1 -type d ...
Używam,
find ./* <...>
gdy nie mam nic przeciwko ignorowaniu plików dot. Pierwszego poziomu (*
glob nie domyślnie dopasowuje ich do bash - patrz opcja „dotglob” we wbudowanym shopt: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).źródło
-exec
opcją. Na przykład, jeśli spróbujeszfind dir/* -type d -exec rmdir {} \;
, zobaczysz błędy.rmdir
i najprawdopodobniej powiedzą ci, że katalogi nie są puste, ponieważfind
najpierw przeprowadzą głębokie przeszukanie katalogów, pokazując rodziców przed dziećmi.Cóż, proste obejście również (rozwiązanie nie działało dla mnie w Windows Git Bash)
find * -type d
Może nie jest zbyt wydajny, ale wykonuje zadanie i czasem tego potrzebujemy.
[Edytuj]: Jak skomentował @AlexanderMills, nie pokaże ukrytych katalogów w lokalizacji głównej (np.
./.hidden
), Ale pokaże ukryte podkatalogi (np../folder/.hiddenSub
). [Testowane z git bash na Windowsie]źródło