Qual è il comando per rimuovere tutti i file ma non le directory?


23

Diciamo che ho un albero di directory come questo:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Se lo usassi rm -r FOLDER/*, tutto in FOLDER verrebbe eliminato, comprese le sottodirectory. Come posso eliminare tutti i file in FOLDER e nelle sue sottodirectory senza eliminare le directory effettive?

Risposte:


37

Quello che stai cercando di fare è l'eliminazione ricorsiva. Per questo è necessario uno strumento ricorsivo, come find.

find FOLDER -type f -delete

13

Con bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Qui iterando su glob nomi di file espansi e rimuovendo solo i file.

Quanto sopra è a secco, se soddisfatto delle modifiche da apportare, rimuovere echoper la rimozione effettiva:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Infine, deseleziona globstar:

shopt -u globstar

Con zsh, sfruttando il qualificatore glob:

echo -- FOLDER/**/*(.)

(.) è un qualificatore glob, che limita le espansioni glob a solo file regolari.

Quanto sopra stamperà solo i nomi dei file, per la rimozione effettiva:

rm -- FOLDER/**/*(.)

2
+1 per zsh globbing. Più persone dovrebbero essere consapevoli delle cose fantastiche che zsh può fare.
marzo

11

Se la tua versione di findnon supporta -deleteè possibile utilizzare quanto segue per eliminare tutti i file nella directory corrente e in basso.

find . ! -type d -exec rm '{}' \;

-exec rm {} +sarebbe più veloce, specialmente se ci sono molti file.
muru,

E find . ! -type d -exec rm {} +rimuove anche i collegamenti sym.
Giustizia per Monica il

1
@muru: se una particolare implementazione di findnon supporta -deleteprobabilmente non supporta -exec ... {} +neanche. Il modo raccomandato per affrontarlo è find ... -print0 | xargs -r0 rm(se ci si aspetta molte potenziali partite).
David Foerster,

5
@DavidFoerster non proprio. -exec ... {} +è POSIX, ma -deletenon lo è. (Neanche a -print0proposito.)
muru,

@muru: abbastanza giusto. Ho riscontrato almeno due findimplementazioni non POSIX che supportavano -print0ma non -exec ... {} +(non mi ricordo -deleteperò). Uno era su OS X, l'altro su Solaris (alcuni anni fa su un sistema molto conservativo). Puoi anche sostituire -print0con -printf '%p\0'. Comunque, questo è Chiedi a Ubuntu e non a Unix e Linux e Ubuntu usa GNU find da sempre.
David Foerster,
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.