Cómo eliminar carpetas con un nombre determinado


139

En Linux, ¿cómo elimino carpetas con un nombre determinado que están anidadas en una jerarquía de carpetas?

Las siguientes rutas están debajo de una carpeta y me gustaría eliminar todas las carpetas nombradas a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

¿Qué comando de Linux debo usar de la carpeta principal?


Tal vez pierda el punto, pero tal vez sí ayude a alguien: tengo 410 carpetas en una carpeta principal, cada una de las 410 con dos subcarpetas. Todas las primeras subcarpetas se denominan 'finales' y contienen archivos PDF editados y una lista de contenido de Word. Todas las segundas subcarpetas llamadas tif_pdf_various_names contienen originalmente archivos tiff guardados escaneados (algunos de hasta 200 páginas), sus archivos PDF no editados y un borrador de la lista de contenido .docx, por lo tanto, una colección de trabajos a domicilio. Necesitaba hacer una colección de las 410 carpetas que contenían solo el material finalmente editado, con los tiffs cerca de 4TB. El método más fácil encontrado fue usar (en Micr
Jurie

Respuestas:


155

Si el directorio de destino está vacío, use find, filtre solo con directorios, filtre por nombre, ejecute rmdir:

find . -type d -name a -exec rmdir {} \;

Si desea eliminar recursivamente su contenido, reemplácelo -exec rmdir {} \;por -deleteo -prune -exec rm -rf {} \;. Otras respuestas incluyen detalles sobre estas versiones, acéptelas también.


9
¿Podría explicar qué {} \;hace?
winklerrr

66
{}puede leerse como "para cada archivo / carpeta coincidente", es decir, sustituye a cada archivo / carpeta "encontrado". \;es un terminador para la -execcláusula
wmorrison365

2
Esto me da un error "no se puede eliminar" cuando el directorio no está vacío
blindeyes

1
Considere agregar un -pruneindicador a la respuesta según la sugerencia de @David Grayson. Sin esto, findaún intentará visitar la carpeta que ahora falta y finalmente saldrá con un código de error, que puede, por ejemplo, fallar en una compilación de Docker.
Czyzby

160

Use find para el nombre "a" y ejecute rm para eliminar aquellos nombrados de acuerdo a sus deseos, de la siguiente manera:

find . -name a -exec rm -rf {} \;

Pruébelo primero usando ls para enumerar:

find . -name a -exec ls {} \;

Para asegurarse de que esto solo elimine directorios y no archivos sin formato, utilice el argumento "-type d" (como se sugiere en los comentarios):

find . -name a -type d -exec rm -rf {} \;

El "{}" es una sustitución para cada archivo "a" encontrado: el comando exec se ejecuta contra cada uno por sustitución.


44
Probablemente desee agregar un "-tipo d" allí solo en caso de que un archivo coincida con el mismo nombre.
Mark Loeser

3
También tenga en cuenta que esto atrapará algo como 1/2/a/3/4, que puede no ser intencionado, por lo que +1 para la recomendación de probar primero ...
twalberg

9
reco echo {}para probarlo primero, en lugar dels {}
Charney Kaye

2
Aquí va mi node_modules/.
saruftw

66
Lo usé find . -name a -type d -exec rm -rf {} \;y funcionó, aunque se imprimió find: ‘./subdir/subdir/a’: No such file or directorypara cada directorio eliminado.
pacoverflow

59

Esto también funciona: eliminará todas las carpetas llamadas "a" y sus contenidos:

rm -rf `find -type d -name a`

@Buffalo, ¿cómo es que? Este defo funciona, pero también lo hacen los demás. Me sorprendería encontrar un entorno en el que esto funcione, pero los demás no dan todas las respuestas find/rm.
wmorrison365

44
@ wmorrison365 porque si lo hace find . -name a -exec rm -rf {} \;, find se bloqueará cuando intente ingresar a ese directorio para buscar más elementos, dándole un error como find: '1/2/3/a': No such file or directory.
Alex Grönholm

@Alex Grönholm seguro, pero todas las carpetas llamadas 'a' se eliminan. Como dice, find no puede mirar posteriormente dentro de una carpeta 'a' eliminada, pero eso no importa. Querer mantener el contenido de 'a' para el procesamiento posterior antes de eliminarlo es un caso de uso diferente al que solicitó el OP.
wmorrison365

66
@ wmorrison365 Sí, los directorios se eliminan, pero no creo que sea bueno recomendar una solución donde el comando falla (devuelve un código de salida distinto de cero).
Alex Grönholm

1
Esto me estaba dando un error illegal option --t. Tuve que pasar también el directorio para buscar en ( stackoverflow.com/questions/25840713/... ): rm -rf `find . -type d -name a`.
Steve Harrison

25

Para eliminar todos los directorios con el nombre foo, ejecute:

find -type d -name foo -a -prune -exec rm -rf {} \;

A las otras respuestas les falta algo importante: la -pruneopción. Sin -prune, GNU find eliminará el directorio con el nombre correspondiente y luego intentará recurrir a él para encontrar más directorios que coincidan. La -pruneopción le dice que no vuelva a aparecer en un directorio que coincida con las condiciones.


21

Terminé aquí buscando eliminar mis node_modulescarpetas antes de hacer una copia de seguridad de mi trabajo en progreso usando rsync. Un requisito clave es que la node_modulescarpeta se puede anidar, por lo que necesita la -pruneopción.

Primero ejecuté esto para verificar visualmente las carpetas que se eliminarán:

find -type d -name node_modules -prune

Luego ejecuté esto para eliminarlos a todos:

find -type d -name node_modules -prune -exec rm -rf {} \;

Gracias a pistache


Ahh, eso funcionó muy bien, para hacer de esto algo que podría usar con facilidad, podría guardarlo como un pequeño shellscript: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Debería hacer el truco. ADVERTENCIA, si bombea accidentalmente una .o /en xargs rm -Rftoda su computadora, se eliminará sin una opción para recuperarla, lo que requerirá la reinstalación del sistema operativo.


2
Oh, solo ese pequeño riesgo. ¿Eso es todo? Jaja. Súper gracias por la advertencia. Definitivamente cometería ese error de tipeo.
TinkerTenorSoftwareGuy

9

Tenía más de 100 archivos como

log-12
log-123
log-34
....

las respuestas anteriores no me funcionaron

pero el siguiente comando me ayudó.

find . -name "log-*" -exec rm  -rf {} \;

di -typecomo .así elimina archivos y carpetas que comienza conlog-

y rm -rfelimina carpetas de forma recursiva incluso si tiene archivos.

si quieres carpetas solo

find -type d -name "log-*" -exec rm  -rf {} \;

archivos solos

find -type f -name "log-*" -exec rm  -rf {} \;

8

Combinando múltiples respuestas, aquí hay un comando que funciona tanto en Linux como en MacOS

rm -rf $(find . -type d -name __pycache__)

Solo uno que funcionó para mí que no arrojó errores
Kloar

7

Otro:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
Esta respuesta solo funciona para carpetas vacías. -deleteno elimina las carpetas no vacías.
maninak

Gracias por agregar la versión OSX
schu34

6

Este comando me funciona. Hace su trabajo recursivamente

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - carpeta actual

"node_modules" - nombre de la carpeta


-2

buscar ruta / a / las / carpetas -maxdepth 1 -name "my_ *" -type d -delete

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.