Come posso cancellare in modo ricorsivo tutti i file di un'estensione specifica nella directory corrente?

416

Come posso cancellare in modo sicuro tutti i file con un'estensione specifica (ad esempio .bak ) dalla directory corrente e tutte le sottocartelle che utilizzano una riga di comando? Semplicemente, ho paura di usare rm poiché l'ho usato una volta e ora ho bisogno di un consiglio.

    
posta user216038 15.11.2013 - 14:03

6 risposte

652

Non hai nemmeno bisogno di usare rm in questo caso se hai paura. Usa find :

find . -name "*.bak" -type f -delete

Ma usalo con precauzione. Esegui prima:

find . -name "*.bak" -type f

per vedere esattamente quali file rimuovere.

Inoltre, assicurati che -delete sia l'ultimo argomento nel tuo comando. Se lo metti prima di -name *.bak argument , eliminerà tutto .

Vedi man find e man rm per ulteriori informazioni e vedere anche questa domanda correlata su SE:

risposta data Radu Rădeanu 15.11.2013 - 14:08
32
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
    
risposta data lokers 04.04.2014 - 21:10
28

Prima esegui il comando shopt -s globstar . Puoi eseguirlo sulla riga di comando e avrà effetto solo in quella finestra della shell. Puoi metterlo nella tua .bashrc , e poi tutte le shell appena avviate lo prenderanno. L'effetto di tale comando è di rendere **/ i file corrispondenti nella directory corrente e le sue sottodirectory in modo ricorsivo (per impostazione predefinita, **/ indica la stessa cosa di */ : solo nelle sottodirectory immediate). Poi:

rm **/*.bak

(o gvfs-trash **/*.bak o cosa hai).

    
risposta data Gilles 15.11.2013 - 19:59
19

L'eliminazione dei file non è per me qualcosa che dovresti usare rm per. Ecco un'alternativa:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Come afferma Flimm nei commenti:

  

Il pacchetto trash-cli fa la stessa cosa di gvfs-trash senza la dipendenza da gvfs.

sudo apt-get install trash-cli

Non è necessario creare un alias per questo, perché il pacchetto trash-cli fornisce un comando trash , che fa ciò che vogliamo.

Come Eliah Kagan chiarisce in ampi commenti, puoi anche renderlo ricorsivo usando find . In tal caso non puoi usare un alias, quindi i comandi seguenti presuppongono che tu abbia installato trash-cli . Riassumo i commenti di Elia:

Questo comando trova e visualizza tutti i .bak di file e collegamenti simbolici in qualsiasi punto della directory corrente o delle sue sottodirectory o di seguito.

find . -name '*.bak' -xtype f

Per eliminarli, aggiungi -exec con il comando trash :

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f seleziona i file e i collegamenti simbolici ai file, ma non alle cartelle. Per eliminare anche le cartelle .bak, rimuovi quella parte e usa -execdir , che evita gli errori cannot trash non-existent per .bak file all'interno di .bak directory:

find . -name '*.bak' -execdir trash {} +
    
risposta data don.joey 15.11.2013 - 14:52
3

Se si desidera eliminare tutti i file di un certo tipo, ma solo una cartella "profonda" dalla cartella corrente:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 perché la directory corrente ". " conta come prima cartella.

    
risposta data Hypocritus 26.11.2017 - 18:21
0

Se sei all'interno di un repository git, puoi usare:

git clean -fdx

Elimina file e file non tracciati in .gitignore.

    
risposta data Vasantha Ganesh K 09.08.2018 - 09:38

Leggi altre domande sui tag