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ż 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 / ! -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 maszynie man 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:
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
-exec
opcją. Na przykład, jeśli spróbujesz find 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]
find /path/ ! -path "/path/first" ! -path "/path/second"
to tylko w ten sposób?