2012-11-23 6 views

risposta

123

POSIX 7 solution:

find . ! -path . -type d 

Per questo caso particolare (.), golf migliore rispetto alle mindepth soluzione (24 vs 26 caratteri), anche se questo è probabilmente un po 'più difficile digitare a causa dello !.

Per escludere altre directory, questo campo da volontà meno bene e richiede una variabile per la secchezza:

D="long_name" 
find "$D" ! -path "$D" -type d 

Il mio albero decisione tra ! e -mindepth:

  • sceneggiatura? Utilizzare ! per la portabilità.
  • sessione interattiva su GNU?
    • esclude .? Lancia una moneta.
    • esclude long_name? Utilizzare -mindepth.
+0

se è necessario escludere più percorsi, basta 'find/path /! -path "/ percorso/primo"! -path "/ path/second" 'è questo solo modo? –

+1

@VincentDeSmet vuoi escludere solo quei percorsi, o in realtà non ricorrere a loro? Se solo i percorsi, puoi usare 'find /! -regex '/ \ (a \ | b \) /.*' 'o più semplicemente, passa attraverso grep. Per non recidivi, quanto sopra sarebbe molto inefficiente e dovresti usare '-prune': http://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh –

+0

my problema era il seguente: volevo cancellare ricorsivamente tutto all'interno di una directory tranne per 1 sottodirectory. Stavo usando 'find' con' grep' per escludere la directory ma la directory principale era ancora lì, facendo sì che tutto fosse cancellato comunque. –

125

Non solo la profondità di ricorsione di find può essere controllata dal parametro -maxdepth, la profondità può anche essere limitata da "alto" utilizzando il parametro -mindepth corrispondente. Quindi, ciò che si ha bisogno in realtà è:

find . -mindepth 1 -type d 
+3

opere su GNU trovano, ma purtroppo è un'estensione GNU al [POSIX 7 Trova] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47) e anche l'LSB usa le utilità di shell POSIX (non quelle estese GNU) –

+3

Questo ha funzionato per me. Vale a dire: 'find. -mindepth 1 -maxdepth 1 -type d ... ' – racl101

+0

Buona osservazione e buona soluzione, evviva! – PCatinean

16

Io uso find ./* <...> quando non mi dispiace ignorando dotfile di primo livello (il glob * non corrisponde questi di default in bash - vedi l'opzione 'dotglob' nel incorporato shopt: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) .

 
eclipse tmp # find . 
. 
./screen 
./screen/.testfile2 
./.X11-unix 
./.ICE-unix 
./tmux-0 
./tmux-0/default 
 
eclipse tmp # find ./* 
./screen 
./screen/.testfile2 
./tmux-0 
./tmux-0/default 
+0

FYI. non usare questo trucco con '-exec'option. Ad esempio, se provi a 'find dir/* -type d -exec rmdir {} \;', vedrai degli errori. – plhn

+0

Ti stai sbagliando, o forse ti sconsigli. Quel comando funzionerà bene. Se vedete degli errori, arriveranno da 'rmdir' e probabilmente vi diranno che le directory non sono vuote poiché' find' eseguirà una ricerca approfondita nelle directory, mostrando i genitori prima dei loro figli. –

+1

Hai ragione, Milos. – plhn