2012-10-23 33 views
54

In Linux, come faccio a rimuovere le cartelle con un certo nome che sono nidificate in profondità in una gerarchia di cartelle?Come rimuovere le cartelle con un determinato nome

I seguenti percorsi si trovano in una cartella e desidero rimuovere tutte le cartelle denominate a.

1/2/3/a 
1/2/3/b 
10/20/30/a 
10/20/30/b 
100/200/300/a 
100/200/300/b 

Quale comando Linux devo utilizzare dalla cartella principale?

risposta

67

Se la directory di destinazione è vuota, utilizzare Trova, filtro con solo le directory, il filtro in base al nome, eseguire rmdir:

find -type d -name a -exec rmdir {} \; 

Se si desidera eliminare ricorsivamente il contenuto, sostituire -exec rmdir {} \; da -delete o -prune -exec rm -rf {} \;. Altre risposte includono dettagli su queste versioni, accreditate anche loro.

79

Usa trovare per nome "a" ed eseguire rm per rimuovere quelli nominato secondo i vostri desideri, come segue:

find . -name a -exec rm -rf {} \; 

prova in primo luogo usando ls alla lista:

find . -name a -exec ls {} \; 

Per assicurare questo rimuove solo le directory e non i file semplici, usa "-type d" arg (come suggerito nei commenti):

find . -name a -type d -exec rm -rf {} \; 

Il "{}" è una sostituzione per ogni file "a" trovato - il comando exec viene eseguito su ciascuno per sostituzione.

+2

Probabilmente si desidera aggiungere un "tipo d" in là solo in caso di un file corrisponde lo stesso nome. –

+1

Notate anche che questo prenderà qualcosa come '1/2/a/3/4', che potrebbe non essere inteso, quindi +1 per la raccomandazione di testare per primo ... – twalberg

+2

reco' echo {} 'per testarlo prima , invece di 'ls {}' – charneykaye

10
find ./ -name "FOLDERNAME" | xargs rm -Rf 

Dovrebbe fare il trucco. ATTENZIONE, se si pompa accidentalmente un . o / in xargs rm -Rf, l'intero computer verrà eliminato senza un'opzione per riaverlo, richiedendo una reinstallazione del sistema operativo.

+0

Questo funziona per me, grazie! – DarkteK

+0

Oh, solo quel piccolissimo rischio. È tutto? Haha. Grazie per l'avvertimento. Definitivamente farei questo errore di battitura. – TinkerTenorSoftwareGuy

21

Questo funziona anche - rimuoverà tutte le cartelle denominate "A" e il loro contenuto:

rm -rf `find -type d -name a` 
+4

Questo è l'unico che funziona davvero. – Buffalo

+0

@Buffalo, come mai? Questo lavoro funziona, ma anche gli altri. Sarebbe sorpreso di trovare un env dove questo funziona, ma gli altri non hanno dato tutte le risposte sono essenzialmente 'find/rm'. – wmorrison365

+2

@ wmorrison365 perché se fai 'find. -name a -exec rm -rf {} \; ', find si blocca quando tenta di entrare in quella directory per cercare altri elementi, dandoti un errore come' find: '1/2/3/a': No such file o directory'. –

6

ho avuto più di 100 file come

log-12 
log-123 
log-34 
.... 

sopra risposte non ha funzionato per me

ma il seguente comando mi ha aiutato.

find . -name "log-*" -exec rm -rf {} \; 

ho dato -type come . quindi elimina entrambi i file e le cartelle che inizia con log-

e rm -rf cancella le cartelle ricorsivamente addirittura ha i file.

se si vuole

find -type d -name "log-*" -exec rm -rf {} \; 

file solo cartelle da solo

find -type f -name "log-*" -exec rm -rf {} \; 
6

Per eliminare tutte le directory con il nome foo, eseguire:

find -type d -name foo -a -prune -exec rm -rf {} \; 

Le altre risposte mancano un importante cosa: l'opzione -prune. Senza -prune, GNU find cancellerà la directory con il nome corrispondente e quindi cercherà di ricorrere in essa per trovare più directory corrispondenti. L'opzione -prune dice di non ricorrere in una directory che corrisponde alle condizioni.

1

Un altro: percorso

"-exec rm -rf {} \;" can be replaced by "-delete" 

find -type d -name __pycache__ -delete  # GNU find 
find . -type d -name __pycache__ -delete # POSIX find (e.g. Mac OS X) 
0

find/a/i/cartelle -maxdepth 1 -name "my_ *" tipo D -delete