Come posso eliminare ricorsivamente tutti i file di un'estensione specifica nella directory corrente?


531

Come posso eliminare in modo sicuro tutti i file con un'estensione specifica (ad es. .bak) Dalla directory corrente e tutte le sottocartelle utilizzando una riga di comando? Semplicemente, ho paura di usare rmpoiché l'ho usato male una volta e ora ho bisogno di consigli.

Risposte:


840

Non hai nemmeno bisogno di usare rmin questo caso se hai paura. Utilizzare find:

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

Ma usalo con precauzione. Esegui prima:

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

per vedere esattamente quali file rimuoverai.

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

Vedi man finde man rmper maggiori informazioni e vedi anche questa domanda correlata su SE:


Come è diverso da questo rm *.bak?
sayantankhan,

10
@ Bolt64 rm *.bakNon funzionerai per le sottodirectory.
Radu Rădeanu,

Con le impostazioni predefinite rm *.bakverranno eliminati solo tutti i file che terminano con .bak nella directory corrente. Per fare anche le cose nelle sottodirectory che ti servivano per giocherellare con globs, usare l'opzione -r o usare l'esempio find.
Hennes,

9
@Hennes Stai attento rm -r *.bak! Rimuove anche le directory che finiscono .bakcon tutto il loro contenuto.
Radu Rădeanu,

37
Assicurati che -deletesia l'ultimo argomento nel tuo comando. Se lo metti prima -name *.bakdell'argomento, eliminerà tutto.
Michael,

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
Benvenuto in askubuntu! Anche se questa è una risposta perfettamente valida, non penso che ci sia alcun vantaggio nell'usarlo al posto della -deletebandiera di find. Ulteriori informazioni sono disponibili nella voce dei manuali GNU per la cancellazione di file con find .
Glutanimate,

2
probabilmente hai ragione, è solo una soluzione alternativa, forse più grezza;)
lokers

11
Questa non è solo un'alternativa ma un esempio di come è possibile combinare altri comandi con la pipe "|". +1
Boris Pavlović,

13
Queste soluzioni alternative funzionano su altri ambienti privi di -elet (come cygwin)
ciriarte

2
Penso che questa sia la migliore risposta qui.
Léo Léopold Hertz

33

Per prima cosa esegui il comando shopt -s globstar. Puoi eseguirlo dalla riga di comando e avrà effetto solo nella finestra della shell. Puoi metterlo nel tuo .bashrc, e poi tutte le shell appena avviate lo prenderanno. L'effetto di quel comando è di fare **/ricorsivamente i file di corrispondenza nella directory corrente e nelle sue sottodirectory (per impostazione predefinita, **/significa la stessa cosa di */: solo nelle sottodirectory immediate). Poi:

rm **/*.bak

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


21

L'eliminazione dei file non è per me qualcosa che dovresti usare rm. 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-clifa la stessa cosa gvfs-trashsenza la dipendenza da gvfs.

Così:

sudo apt-get install trash-cli

Non è necessario creare un alias per questo, perché il trash-clipacchetto fornisce un comando trash, che fa quello che vogliamo.

Come Eliah Kagan chiarisce in ampi commenti, puoi anche rendere questo uso ricorsivo find. In tal caso non è possibile utilizzare un alias, quindi i comandi seguenti presuppongono l'installazione trash-cli. Riassumo i commenti di Eliah:

Questo comando trova e visualizza tutti i .bakfile e i collegamenti simbolici ovunque nella directory corrente o nelle sue sottodirectory o in basso.

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

Per eliminarli, aggiungi un -execcon il trashcomando:

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

-xtype fseleziona file e collegamenti simbolici ai file, ma non alle cartelle. Per eliminare anche le cartelle .bak, rimuovere quella parte e utilizzarla -execdir, evitando cannot trash non-existenterrori per i .bakfile all'interno delle .bakdirectory:

find . -name '*.bak' -execdir trash {} +

4
"Non usare rmper eliminare le cose" è un'affermazione controversa, ma devo ammettere che spesso è più saggio usare qualcosa che ti permetterà di annullare le cose.
Oli

2
Il pacchetto trash-clifa la stessa cosa gvfs-trashsenza la dipendenza da gvfs.
Flimm,

L'ho modificato nella risposta, la prossima volta sentiti libero di fare tu stesso la modifica.
don.joey,

@ don.joey Questa risposta sembra dire find . -name "*.bak" -type fmostra ciò che trash *.bakelimina. È davvero quello che vuoi dire? Puoi spostare le directory nel cestino con trasho gvfs-trash, ma trash *.baksposta solo i file e le directory i cui nomi finiscono con .bake che risiedono immediatamente nella directory corrente. La shell si espande *.bak, quindi trash *.baknon influirà sui .bakfile nelle sottodirectory non nominate .bak.
Eliah Kagan,

1
@ don.joey Sì ls *.bak(che penso che intendi) elenca cosa trash *.baktrash. find . -name '*.bak' -xtype f -exec trash {} +elimina tutti i .bakfile ovunque sotto .. Non può usare un alias, quindi installa trash-clio scrivi gvfs-trashinvece. Ecco un esempio -xtype fseleziona file e collegamenti simbolici ai file, ma non alle cartelle. Per eliminare anche le .bak cartelle , utilizzare find . -name '*.bak' -execdir trash {} +, che evita cannot trash non existenterrori per i .bakfile all'interno delle .bakdirectory. Sentiti libero di usare tutto ciò nella tua risposta.
Eliah Kagan,

5

Se vuoi eliminare tutti i file di un certo tipo, ma solo 1 cartella "profonda" dalla cartella corrente:

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

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


1

Risposta rapida:

  • Elimina in modo ricorsivo tutti i file con il nome o postfix considerato:

    find . -name '*.pyc' -type f -delete

  • Elimina ricorsivamente tutte le directory con il nome considerato:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    Un po 'meno strettamente controllato, ma in una sola riga:

    find ~ -path '*/__pycache__*' -delete
    

[ NOTA ]:

dè un'opzione di directory ed fè un'opzione di file.


0

Se ti trovi in ​​un repository git, puoi usare:

git clean -fdx

Ciò elimina i file non tracciati e i file in .gitignore.

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.