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 mindepth
soluzione (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/...
find
con grep
per 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 find
sono 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 find
può essere controllata dal -maxdepth
parametro, ma la profondità può anche essere limitata da "top" utilizzando il -mindepth
parametro 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
-exec
opzione. Ad esempio, se ci provi find dir/* -type d -exec rmdir {} \;
, vedrai degli errori.
rmdir
e probabilmente ti diranno che le directory non sono vuote poiché find
effettueranno 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?