find . -type d
può essere usato per trovare tutte le directory sotto un punto di partenza. Ma restituisce anche la directory corrente ( .), che potrebbe essere indesiderata. Come può essere escluso?
find . -type d
può essere usato per trovare tutte le directory sotto un punto di partenza. Ma restituisce anche la directory corrente ( .), che potrebbe essere indesiderata. Come può essere escluso?
Risposte:
find . ! -path . -type d
Per questo caso particolare ( .), il golf è migliore della mindepthsoluzione (24 vs 26 caratteri), anche se questo è probabilmente leggermente più difficile da digitare a causa del !.
Per escludere altre directory, questo giocherà a golf meno bene e richiede una variabile per DRYness:
D="long_name"
find "$D" ! -path "$D" -type d
Il mio albero decisionale tra !e -mindepth:
!per la portabilità..? Lancia una moneta.long_name? Usa -mindepth.find / ! -regex '/\(a\|b\)/.*'o più semplicemente, passare attraverso grep. Per non recurse, quanto sopra sarebbe molto inefficiente e si dovrebbe utilizzare -prune: stackoverflow.com/questions/1489277/...
findcon grepper escludere la directory ma la directory principale era ancora lì, causando comunque l'eliminazione di tutto.
find, dovresti controllare i prefissi: stackoverflow.com/questions/17959317/… Ma un Bash for loop può gestirlo :-)
\!) per essere al sicuro. Tutti gli esempi nella mia macchina man findsono sfuggiti, quindi sembra che sia probabilmente una buona idea ™. Modifica - Ho appena notato che dice anche esplicitamente:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Non solo la profondità di ricorsione di findpuò essere controllata dal -maxdepthparametro, ma la profondità può anche essere limitata da "top" utilizzando il -mindepthparametro corrispondente . Quindi ciò di cui uno ha effettivamente bisogno è:
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
Uso find ./* <...>quando non mi dispiace ignorare i dotfile di primo livello (il *glob non corrisponde a questi di default in bash - vedi l'opzione 'dotglob' nell'installa shopt: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).
eclipse tmp # find. . ./schermo ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./schermo ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-execopzione. Ad esempio, se ci provi find dir/* -type d -exec rmdir {} \;, vedrai degli errori.
rmdire probabilmente ti diranno che le directory non sono vuote poiché findeffettueranno una ricerca approfondita nelle directory, mostrando i genitori davanti ai loro figli.
Bene, anche una semplice soluzione alternativa (la soluzione non funzionava per me su windows git bash)
find * -type d
Potrebbe non essere molto performante, ma svolge il lavoro ed è ciò di cui abbiamo bisogno a volte.
[Modifica]: come commentato da @AlexanderMills, non mostrerà directory nascoste nella posizione principale (ad es. ./.hidden), Ma mostrerà sottodirectory nascoste (ad es. ./folder/.hiddenSub). [Testato con git bash su windows]
find /path/ ! -path "/path/first" ! -path "/path/second"è solo questo?