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


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


421
2017-11-15 13:03


origine




risposte:


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

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

Ma usalo con precauzione. Esegui prima:

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

per vedere esattamente quali file rimuovere.

Anche, assicurati che -delete è l'ultimo argomento nel tuo comando. Se lo metti prima del -name *.bak argument, cancellerà tutto.

Vedere man find e man rm per maggiori informazioni e vedere anche questa domanda relativa su SE:


660
2017-11-15 13:08



Come è diverso da questo rm *.bak? - sayantankhan
@ Bolt64 tuo rm *.bak non funzionerà per le sottodirectory. - Radu Rădeanu
Con le impostazioni predefinite rm *.bak cancellerà solo tutti i file che terminano con .bak nella directory corrente. Per fare anche cose nelle sottodirectory che hai bisogno di giocare con i glob, usa l'opzione -r o usa l'esempio di ricerca. - Hennes
@Hennes Stai attento con rm -r *.bak! Rimuove anche le directory che terminano in .bak con tutto il loro contenuto. - Radu Rădeanu
Assicurarsi quella -delete è l'ultimo argomento nel tuo comando. Se lo metti prima del -name *.bak discussione, cancellerà tutto. - Michael


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

32
2018-04-04 19:10



Benvenuto su askubuntu! Anche se questa è una risposta perfettamente valida, non credo che ci sia alcun vantaggio nell'usare questo anziché il -delete bandiera di find. Maggiori informazioni possono essere trovate nel Immissione di manuali GNU per l'eliminazione di file con find. - Glutanimate
probabilmente hai ragione, è solo una soluzione alternativa, forse più grezza;) - lokers
Questa non è solo un'alternativa, ma un esempio di come altri comandi possono essere combinati insieme al tubo '|'. +1 - Boris Pavlović
Queste soluzioni alternative funzionano su altri ambienti che mancano -delete (come cygwin) - ciriarte
Penso che questa sia la migliore risposta qui. - Léo Léopold Hertz 준영


Per prima cosa esegui il comando shopt -s globstar. Puoi eseguirlo sulla riga di comando e avrà effetto solo in quella finestra della shell. Puoi metterlo nel tuo .bashrce quindi tutte le nuove shell avviate lo raccoglieranno. L'effetto di quel comando è di fare **/ associare i file nella directory corrente e le sue sottodirectory in modo ricorsivo (per impostazione predefinita, **/ significa la stessa cosa di */: solo nelle sottodirectory immediate). Poi:

rm **/*.bak

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


28
2017-11-15 18:59





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.

Così:

sudo apt-get install trash-cli

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

Come Eliah Kagan ha chiarito in ampi commenti, puoi anche renderlo ricorsivo usando find. In tal caso non è possibile utilizzare un alias, quindi i comandi sottostanti presumono che tu abbia installato trash-cli. Riassumo i commenti di Elia:

Questo comando trova e visualizza tutto .bak file e collegamenti simbolici ovunque nella directory corrente o nelle sue sottodirectory o sotto.

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

Per eliminarli, aggiungere un -exec con il trash comando:

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, rimuovere quella parte e utilizzarla -execdir, che evita cannot trash non-existent errori per .bak file all'interno .bak directory:

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

19
2017-11-15 13:52



"Non usare rm cancellare le cose "è una dichiarazione controversa, ma devo ammettere che spesso è più saggio usare qualcosa che ti consenta di annullare le cose. - Oli♦
Il pacchetto trash-cli fa la stessa cosa di gvfs-trash senza la dipendenza da gvfs. - Flimm
L'ho modificato nella risposta, la prossima volta sentiti libero di fare la modifica da solo. - don.joey
@ don.joey Questa risposta sembra dire find . -name "*.bak" -type f mostra cosa trash *.bak cancella. È davvero quello che intendi? Puoi spostare le directory nel cestino con trash o gvfs-trash, ma trash *.bak sposta solo i file e le directory i cui nomi terminano con .bak e che risiedono immediatamente nella directory corrente. La shell si espande *.bak, così trash *.bak non influenzerà .bak file in sottodirectory non loro stessi nominati .bak. - Eliah Kagan
@ don.joey Sì ls *.bak (che penso tu intenda) elenca cosa trash *.bak rovini. find . -name '*.bak' -xtype f -exec trash {} + distrugge tutto .bak file ovunque sotto .. Non è possibile utilizzare un alias, quindi installare trash-cli o scrivere gvfs-trash anziché. Ecco un esempio.  -xtype f seleziona i file e i collegamenti simbolici ai file, ma non alle cartelle. Cancellare .bak  cartelle anche, usa find . -name '*.bak' -execdir trash {} +, che evita cannot trash non existent errori per .bak file all'interno .bak le directory. Sentiti libero di usare qualsiasi cosa nella tua risposta. - Eliah Kagan


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.


3
2017-11-26 17:21





Se si è all'interno di un repository git, è possibile utilizzare:

git clean -fdx

Questo elimina file e file non tracciati in .gitignore.


0
2017-08-09 07:38