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

¿Cómo elimino de forma segura todos los archivos con una extensión específica (p. ej. .bak) desde el directorio actual y todas las subcarpetas usando una línea de comandos? Simplemente, tengo miedo de usar rm ya que una vez lo usé mal y ahora necesito un consejo.

Ni siquiera necesitas usar rm en este caso, si tienes miedo. Utilizar find:

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

Pero úsalo con precaución. Corre primero:

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

para ver exactamente qué archivos eliminará.

También, asegúrese de que -delete es el último argumento a sus órdenes. Si lo pones antes de la -name *.bak argument, eliminará todo.

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

 < código>buscar . -nombre "*.bak " - tipo f-print0 / xargs -0 / bin / rm-f

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

rm **/*.bak

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

Eliminar archivos para mí no es algo que debas usar rm para. Aquí hay una alternativa:

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

Como afirma Flimm en los comentarios:

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

Tan:

sudo apt-get install trash-cli

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

Como Eliah Kagan deja en claro en extensos comentarios, también puede hacer que esto sea recursivo usando find. En ese caso, no puede usar un alias, por lo que los comandos a continuación asumen que ha instalado trash-cli. Resumo los comentarios de Elías:

Este comando busca y muestra todos los .bak archivos y enlaces simbólicos en cualquier lugar del directorio actual o sus subdirectorios o debajo.

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

Para eliminarlos, agregue un -exec con el trash comando:

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

-xtype f selecciona archivos y enlaces simbólicos a archivos, pero no carpetas. Eliminar .carpetas bak también, elimine esa parte y use -execdir, lo que evita cannot trash non-existent errores para .bak archivos en el interior .bak Directory:

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

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

- profundidad máxima 2 porque el directorio actual "."cuenta como la primera carpeta.

Respuesta Rápida:

  • Elimine todos los archivos con el nombre o el sufijo considerados de forma recursiva:

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

  • Elimine todos los directorios con el nombre considerado de forma recursiva:

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

    Algo menos controlado, pero en una sola línea:

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

[NOTA]:

d es la opción de directorio y f es la opción de archivo.

Puede enumerar todos los archivos con esa extensión primero antes de usar rmPor ejemplo,

ls *.bak

Si obtiene solo los archivos que desea eliminar, puede usar el rm

rm *.bak

Si en caso de que desee verificar la lista antes de eliminar los archivos, puede hacer eco de ella.

find . -name "*.bak" -type f | xargs echo rm -rf

Esto mostrará una lista de los resultados de búsqueda que se canalizan al comando rm a través de xargs.Una vez que esté seguro de la lista, puede soltar el eco en el comando anterior.

find . -name "*.bak" -type f | xargs rm -rf

Publicación relacionada - ¿Cómo elimino directorios de forma recursiva con comodín?