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

531

¿Cómo elimino con seguridad todos los archivos con una extensión específica (por ejemplo .bak) del directorio actual y todas las subcarpetas usando una línea de comandos? Simplemente, me da miedo usarlo rmya que lo usé mal una vez y ahora necesito consejos.

usuario216038
fuente

Respuestas:

840

Ni siquiera necesita usarlo rmen este caso si tiene miedo. Uso 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á.

Además, asegúrese de que ese -deletesea ​​el último argumento en su comando. Si lo pones antes de -name *.bak argument, eliminará todo .

Vea man findy man rmpara más información y vea también esta pregunta relacionada sobre SE:

Radu Rădeanu
fuente
¿Cómo es esto diferente de rm *.bak?
sayantankhan
10
@ Bolt64 Su rm *.bakno funcionará para subdirectorios.
Radu Rădeanu
Con la configuración predeterminada rm *.baksolo se eliminarán todos los archivos que terminen en .bak en el directorio actual. TO también hace cosas en subdirectorios que necesitabas para jugar con globos, usa la opción -r o usa el ejemplo de búsqueda.
Hennes
99
@Hennes ¡Cuidado con rm -r *.bak! También elimina directorios que terminan .bakcon todo su contenido.
Radu Rădeanu
37
Asegúrese de que ese -deletesea ​​el último argumento en su comando. Si lo pones antes del -name *.bakargumento, eliminará todo.
Michael
40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
lokers
fuente
1
Bienvenido a askubuntu! Si bien esta es una respuesta perfectamente válida, no creo que haya ninguna ventaja en usar esto en lugar de la -deletebandera de find. Se puede encontrar más información en la entrada de manuales de GNU para eliminar archivos con find .
Glutanimate
2
probablemente tenga razón, es solo una solución alternativa, quizás más cruda;)
lokers
11
Esta no es solo una alternativa, sino un ejemplo de cómo se pueden combinar otros comandos junto con la tubería '|'. +1
Boris Pavlović
13
Estas soluciones alternativas funcionan en otros entornos que carecen de eliminación (como cygwin)
ciriarte
2
Creo que esta es la mejor respuesta aquí.
Léo Léopold Hertz 준영
33

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 proyectiles recién comenzados lo recogerán. El efecto de ese comando es hacer **/coincidir los archivos en el 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 **/*.bakque tienes)

Gilles
fuente
21

Para mí, eliminar archivos no es algo que deba usar rm. 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-clihace lo mismo que gvfs-trashsin la dependencia de gvfs.

Entonces:

sudo apt-get install trash-cli

No necesita hacer un alias para esto, porque el trash-clipaquete proporciona un comando trash, que hace lo que queremos.

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

Este comando encuentra y muestra todos los .bakarchivos y enlaces simbólicos en cualquier parte del directorio actual o sus subdirectorios o debajo.

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

Para eliminarlos, agregue un -execcon el trashcomando:

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

-xtype fselecciona archivos y enlaces simbólicos a archivos, pero no carpetas. Para eliminar también las carpetas .bak, elimine esa parte y use -execdir, lo que evita cannot trash non-existenterrores para los .bakarchivos dentro de los .bakdirectorios:

find . -name '*.bak' -execdir trash {} +
don.joey
fuente
44
"No usar rmpara eliminar cosas" es una declaración controvertida, pero tengo que estar de acuerdo en que a menudo es más inteligente usar algo que te permita deshacer cosas.
Oli
2
El paquete trash-clihace lo mismo que gvfs-trashsin la dependencia de gvfs.
Flimm
Lo he editado en la respuesta, la próxima vez no dude en hacer la edición usted mismo.
don.joey el
@ don.joey Esta respuesta parece decir que find . -name "*.bak" -type fmuestra lo que se trash *.bakelimina. ¿Eso es realmente lo que quieres decir? Puede mover directorios a la papelera con trasho gvfs-trash, pero trash *.baksolo moverá archivos y directorios cuyos nombres terminen en .baky que residan inmediatamente en el directorio actual. El shell se expande *.bak, por trash *.baklo que no afectará a los .bakarchivos en subdirectorios que no tengan nombre .bak.
Eliah Kagan
1
@ don.joey Sí ls *.bak(que creo que quieres decir) enumera qué trash *.bakbasura. find . -name '*.bak' -xtype f -exec trash {} +destruye todos los .bakarchivos en cualquier lugar debajo .. No puede usar un alias, así que instale trash-clio escriba en su gvfs-trashlugar. Aquí hay un ejemplo. -xtype fselecciona archivos y enlaces simbólicos a archivos, pero no carpetas. Para eliminar .bak carpetas también, use find . -name '*.bak' -execdir trash {} +, lo que evita cannot trash non existenterrores para los .bakarchivos dentro de los .bakdirectorios. Por favor, siéntase libre de usar todo esto en su respuesta.
Eliah Kagan
5

Si desea eliminar todos los archivos de cierto tipo, 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.

Hipócrita
fuente
1

Respuesta rápida:

  • Elimine todos los archivos con el nombre considerado o postfix 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 estrictamente controlado, pero en una sola línea:

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

[ NOTA ]:

des la opción de directorio y fes la opción de archivo.

Benyamin Jafari
fuente
0

Si está dentro de un repositorio de git, puede usar:

git clean -fdx

Esto elimina archivos no rastreados y archivos en .gitignore.

Vasantha Ganesh K
fuente