Rimuovere tutti i file in modo ricorsivo senza eliminare le directory


10

Voglio "ripulire" tutti i file da una directory inclusi tutti i file nelle sottodirectory, ma voglio lasciare le sottodirectory in atto. La mia comprensione rm -rè che eliminerà anche le stesse sottodirectory.

Io non voglio eliminare i file nascosti (dot).

Come si può fare?


1
find -type f ! -name "[.]*" -deletenon è adatto?
Costas,

Non lo so. Fa quello che sto chiedendo?
Scott Wilton,

Prova senza -delete: stampa solo i nomi dei file da eliminare.
Costas,

Vuoi eliminare i file (nascosti o meno) nelle directory nascoste?
Stéphane Chazelas,

Che dire dei link simbolici alle directory?
Stéphane Chazelas,

Risposte:


10

Utilizzare findper quello:

find . ! -name '.*' ! -type d -exec rm -- {} +

1
Non tutte le implementazioni sono state -delete
trovate

3
@RomeoNinov, leggi la domanda OP:I do not want to delete hidden (dot) files.
jimmij,

1
@Costas, no, non c'è shell che richieda l'escaping +(almeno non nelle famiglie Bourne, csh o rc). C'è una leggenda che dice che alcune vecchie versioni di cshescape necessarie {}ma non mi sono mai imbattuto in quelle.
Stéphane Chazelas,

1
@ScottWilton Le directory nascoste sono incluse, ma i file nascosti nelle directory nascoste no. Se si desidera rifiutare tutti i file nelle directory nascoste, allora find . ! -name '.*' ! -type d ! -path '*/.*'dovrebbe fare il lavoro.
Jimmij,

1
@jimmy, più piace find . -name '.?*' -prune -o ! -type d -exec rm {} +evitare di scendere in quelli del tutto. Nota che --non è necessario qui (non fa male però) poiché i percorsi iniziano con ./.
Stéphane Chazelas,

0

prova qualcosa del tipo:

find <path> ! -name '.*' -type f -exec rm {} \;

Qual è il motivo per cui rimuovere i file uno alla volta invece di velocizzare le cose .... -exec rm {} + ?
Anthon,

Preferisco fare le cose una per una. Le operazioni di massa (e parallele) hanno qualche tempo effetti collaterali strani (e spiacevoli) (come fanno un carico enorme sul sottosistema I / O)
Romeo Ninov

1
-exec rm {} +non è parallelo, chiama solo rmcon diversi nomi di file. Gestisce meno rminvocazioni, quindi è più rispettoso delle risorse. Se è leggermente meno sicuro in quanto allarga la finestra della corsa all'interno della quale un componente della directory dei file da rimuovere può essere cambiato in un collegamento simbolico. Ma solo -deleteo -execdir rm {} \;lo affronteremo pienamente.
Stéphane Chazelas,

@ StéphaneChazelas, nessuno di questi (-delete o -execdir) esiste in UNIX. E non vedo in questione essere menzionato Linux!
Romeo Ninov,

@RomeoNinov, sì, ho detto in un altro commento qui che -execè solo standard. -deletee -execdirprovengono da BSD, GNU li ha aggiunti circa 10 anni dopo. In ogni caso, ciò non ha nulla a che fare con Linux, che è solo un kernel.
Stéphane Chazelas,
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.