Come escludere questa cartella / current / dot dalla ricerca "tipo d"


186
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:


194

Soluzione POSIX 7 :

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:

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

se è necessario escludere più percorsi, find /path/ ! -path "/path/first" ! -path "/path/second"è solo questo?
Vincent De Smet,

2
@VincentDeSmet vuoi escludere solo quei percorsi, o in realtà non ricorrere in essi? Se solo i percorsi, è possibile utilizzare 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/...
Ciro Santilli郝海东冠状病六四事件法轮功

il mio problema era il seguente: volevo eliminare in modo ricorsivo tutto all'interno di una directory tranne 1 sottodirectory. Stavo usando findcon grepper escludere la directory ma la directory principale era ancora lì, causando comunque l'eliminazione di tutto.
Vincent De Smet,

@VincentDeSmet Non vedo una soluzione diretta con find, dovresti controllare i prefissi: stackoverflow.com/questions/17959317/… Ma un Bash for loop può gestirlo :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功

Probabilmente vuoi scappare dal punto esclamativo char ( \!) 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.
Adrian Günter,

201

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

5
funziona su GNU find, ma sfortunatamente è un'estensione gnu di POSIX 7 find , e anche LSB usa utility shell POSIX (non quelle GNU estese)
Ciro Santilli 30 冠状 病 六四 事件 法轮功

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

19

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

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

Ti sbagli, o forse sei sconsiderato. Quel comando funzionerà benissimo. Se visualizzi errori, verranno rmdire probabilmente ti diranno che le directory non sono vuote poiché findeffettueranno una ricerca approfondita nelle directory, mostrando i genitori davanti ai loro figli.
Milos Ivanovic,

2
Nota: "ignorare i dotfile di primo livello" significa anche escludere tutti i file / directory nascosti.
Jonathan H,

2

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]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.