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 . -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ć?
Odpowiedzi:
find . ! -path . -type d
W tym konkretnym przypadku ( .) golfy są lepsze niż mindepthrozwią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 / ! -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/...
findz, grepaby 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 maszynie man finduciekł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 findmoże kontrolować nie tylko głębokość rekurencji -maxdepth, ale także ograniczać głębokość od „góry” za pomocą odpowiedniego -mindepthparametru. Więc tak naprawdę potrzebujemy:
find . -mindepth 1 -type d
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 ).
eclipse tmp # find. . ./ekran ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./ekran ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-execopcją. Na przykład, jeśli spróbujesz find dir/* -type d -exec rmdir {} \;, zobaczysz błędy.
rmdiri najprawdopodobniej powiedzą ci, że katalogi nie są puste, ponieważ findnajpierw 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]
find /path/ ! -path "/path/first" ! -path "/path/second"to tylko w ten sposób?