Come rimuovere le cartelle con un certo nome


139

In Linux, come rimuovo le cartelle con un certo nome che sono nidificate in profondità nella gerarchia di cartelle?

I seguenti percorsi si trovano in una cartella e vorrei 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 dovrei usare dalla cartella principale?


Forse manca il punto ma forse aiuta qualcuno: ho 410 cartelle in una cartella principale - ognuna delle 410 con due sottocartelle. Tutte le prime sottocartelle sono denominate "final" e contengono PDF modificati e un elenco di contenuti di Word. Tutte le seconde sottocartelle denominate tif_pdf_various_names contengono file salvati su tiff (scansionati fino a 200 pagine), i loro pdf non modificati e una bozza di elenco di contenuti .docx, quindi una raccolta di lavori domestici. Avevo bisogno di fare una raccolta delle 410 cartelle contenenti solo il materiale finalmente modificato, con i tiff vicini a 4 TB. Il metodo più semplice trovato era quello di usare (in Micr
Jurie il

Risposte:


155

Se la directory di destinazione è vuota, utilizzare trova, filtra solo con directory, filtra per nome, esegue rmdir:

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

Se si desidera eliminare in modo ricorsivo il suo contenuto, sostituirlo -exec rmdir {} \;con -deleteo -prune -exec rm -rf {} \;. Altre risposte includono dettagli su queste versioni, merito anche loro.


9
Potresti spiegare cosa {} \;fa?
winklerrr,

6
{}può essere letto come "per ogni file / cartella corrispondente", ovvero sostituisce ogni file / cartella "trovato". \;è un terminatore per la -execclausola.
wmorrison365

2
Questo mi dà un errore "impossibile eliminare" quando la directory non è vuota
blindeyes

1
Prendi in considerazione l'aggiunta di -pruneflag alla risposta secondo il suggerimento di @David Grayson. Senza questo, findproverà comunque a visitare la cartella mancante e alla fine uscirà con un codice di errore, che può ad esempio fallire una compilazione Docker.
Czyzby

160

Usa find per "a" ed esegui rm per rimuovere quelli nominati secondo i tuoi desideri, come segue:

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

Provalo prima usando ls per elencare:

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

Per assicurarti che ciò rimuova solo le directory e non i file semplici, usa l'arg "-type d" (come suggerito nei commenti):

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

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


4
Probabilmente vuoi aggiungere un "-type d" in lì solo se un file corrisponde allo stesso nome.
Mark Loeser,

3
Si noti inoltre che ciò catturerà qualcosa del genere 1/2/a/3/4, che potrebbe non essere previsto, quindi +1 per la raccomandazione di testare prima ...
twalberg,

9
reco echo {}per provarlo prima, invece dils {}
Charney Kaye

2
Ecco il mio node_modules/.
saruftw,

6
Ho usato find . -name a -type d -exec rm -rf {} \;e ha funzionato, anche se è stato stampato find: ‘./subdir/subdir/a’: No such file or directoryper ogni directory eliminata.
pacoverflow

59

Questo funziona anche: rimuoverà tutte le cartelle chiamate "a" e il loro contenuto:

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

@Buffalo, come mai? Questo defo funziona ma anche gli altri. Sarebbe sorpreso di trovare un ambiente in cui questo funziona, ma gli altri non hanno dato tutte le risposte sono essenzialmente find/rm.
wmorrison365,

4
@ wmorrison365 perché se lo fai find . -name a -exec rm -rf {} \;, find si bloccherà quando proverà ad accedere a quella directory per cercare altri elementi, dandoti un errore simile find: '1/2/3/a': No such file or directory.
Alex Grönholm,

@Alex Grönholm certo, ma tutte le cartelle denominate 'a' vengono comunque eliminate. Come hai affermato, find non può successivamente cercare all'interno di una cartella "a" eliminata, ma non importa. Volere conservare il contenuto di "a" per l'elaborazione successiva prima dell'eliminazione è un caso d'uso diverso da quello richiesto dall'OP.
wmorrison365,

6
@ wmorrison365 Sì, le directory vengono eliminate ma non credo sia consigliabile consigliare una soluzione in cui il comando non riesce (restituisce un codice di uscita diverso da zero).
Alex Grönholm,

1
Questo mi stava dando un errore illegal option --t. Ho dovuto passare anche la directory in cui cercare ( stackoverflow.com/questions/25840713/... ): rm -rf `find . -type d -name a`.
Steve Harrison,

25

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

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

Alle altre risposte manca una cosa importante: l' -pruneopzione. Senza -prune, GNU find eliminerà la directory con il nome corrispondente e quindi proverà a ricorrere in essa per trovare più directory corrispondenti. L' -pruneopzione indica di non ricorrere in una directory che corrispondesse alle condizioni.


21

Sono finito qui cercando di eliminare le mie node_modulescartelle prima di fare un backup dei miei lavori in corso usando rsync. Un requisito chiave è che la node_modulescartella può essere nidificata, quindi è necessario il-prune opzione.

Per prima cosa l'ho eseguito per verificare visivamente le cartelle da eliminare:

find -type d -name node_modules -prune

Quindi l'ho eseguito per eliminarli tutti:

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

Grazie al pistacchio


Ahh ha funzionato bene, per rendere questo qualcosa che potresti usare con facilità potresti salvarlo come un piccolo shellscript: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell,

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

Dovrebbe fare il trucco. ATTENZIONE, se si pompa accidentalmente un .o /in xargs rm -Rftutto il computer sarà cancellato, senza la possibilità di tornare indietro, che richiede una reinstallazione del sistema operativo.


2
Oh, solo quel piccolo rischio da ragazzino. È tutto? Haha. Super grazie per l'avvertimento. Farei sicuramente quell'errore di battitura.
TinkerTenorSoftware Acquista

9

Ho avuto più di 100 file simili

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

le risposte sopra non hanno funzionato per me

ma il seguente comando mi ha aiutato.

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

ho dato -typein .modo da eliminare sia i file che le cartelle che iniziano conlog-

e rm -rf elimina le cartelle in modo ricorsivo anche se ha dei file.

se vuoi solo cartelle

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

solo file

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

8

Combinando più risposte, ecco un comando che funziona sia su Linux che su MacOS

rm -rf $(find . -type d -name __pycache__)

Solo uno che ha funzionato per me che non ha
generato

7

Un altro:

"-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)

3
Questa risposta funziona solo per cartelle vuote. -deletenon rimuove le cartelle non vuote.
maninak,

Grazie per aver aggiunto la versione OSX
schu34

6

Questo comando funziona per me. Fa il suo lavoro in modo ricorsivo

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - cartella corrente

"node_modules" - nome della cartella


-2

trova percorso / to / the / cartelle -maxdepth 1 -name "my_ *" -type d -delete

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.