¿Cómo puedo eliminar recursivamente todos los archivos de una extensión específica en el directorio actual?

418

¿Cómo puedo eliminar de forma segura todos los archivos con una extensión específica (por ejemplo, .bak ) del directorio actual y todas las subcarpetas que usan una línea de comando? Simplemente, me da miedo usar rm ya que lo usé mal una vez y ahora necesito ayuda.

    
pregunta user216038 15.11.2013 - 14:03

6 respuestas

657

Ni siquiera necesita usar rm en este caso si tiene miedo. Use find :

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

Pero úsalo con precaución. Ejecutar primero:

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

para ver exactamente qué archivos eliminará.

Además, asegúrese de que -delete sea el último argumento en su comando. Si lo coloca antes del -name *.bak argument , eliminará todo .

Consulte man find y man rm para obtener más información y ver también esta pregunta relacionada en SE:

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

Primero ejecuta el comando shopt -s globstar . Puede ejecutar eso en la línea de comando, y tendrá efecto solo en esa ventana de shell. Puedes ponerlo en tu .bashrc , y luego todos los shells recién iniciados lo recogerán. El efecto de ese comando es hacer que **/ coincida con los archivos en el directorio actual y sus subdirectorios recursivamente (de forma predeterminada, **/ significa lo mismo que */ : solo en los subdirectorios inmediatos). Entonces:

rm **/*.bak

(o gvfs-trash **/*.bak o lo que sea).

    
respondido por el Gilles 15.11.2013 - 19:59
19

Eliminar archivos no es algo para lo que deba usar rm para. Aquí hay una 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)

Como dice Flimm en los comentarios:

  

El paquete trash-cli hace lo mismo que gvfs-trash sin la dependencia de gvfs.

Entonces:

sudo apt-get install trash-cli

No necesita crear un alias para esto, porque el paquete trash-cli proporciona un comando trash , que hace lo que queremos.

Como Eliah Kagan deja en claro en extensos comentarios, también puedes hacer esto recursivo usando find . En ese caso, no puede usar un alias, por lo que los siguientes comandos suponen que ha instalado trash-cli . Resumo los comentarios de Eliah:

Este comando busca y muestra todos los .bak archivos y enlaces simbólicos en cualquier parte del directorio actual o sus subdirectorios o más abajo.

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

Para eliminarlos, añada un -exec con el comando trash :

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

-xtype f selecciona archivos y enlaces simbólicos a archivos, pero no a carpetas. Para eliminar carpetas .bak también, elimine esa parte y use -execdir , que evita cannot trash non-existent errors para .bak archivos dentro de .bak directorios:

find . -name '*.bak' -execdir trash {} +
    
respondido por el don.joey 15.11.2013 - 14:52
3

Si desea eliminar todos los archivos de un tipo determinado, pero solo 1 carpeta "profunda" de la carpeta actual:

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

-maxdepth 2 porque el directorio actual ". " cuenta como la primera carpeta.

    
respondido por el Hypocritus 26.11.2017 - 18:21
0

Si estás dentro de un repositorio git, puedes usar:

git clean -fdx

Esto elimina archivos y archivos sin seguimiento en .gitignore.

    
respondido por el Vasantha Ganesh K 09.08.2018 - 09:38

Lea otras preguntas en las etiquetas