Debian: eliminar miles de archivos

Debian: eliminar miles de archivos

Tengo una máquina que ejecuta Debian Squeeze con apache, mysql, php... En uno de los directorios hay otros directorios y demasiados archivos de más de 500k, intenté eliminarlos mediante WinSCP pero se bloquea. Incluso después de más de 24 horas, WinSCP sigue sin responder. En este momento estoy intentando eliminar este directorio con Putty (rm -rf dirname), pero al igual que WinSCP, dejó de responder. ¿Alguna sugerencia? ¡Gracias!

Tengo acceso root a la máquina.

Respuesta1

Eliminar el directorio debería funcionar. Es posible que tenga problemas si intenta eliminar archivos individuales porque hay muchos. ¿No estás corriendo, rm -rf dirname/*verdad?

Supongo que está perdiendo la conexión ssh debido a la inactividad. ¿Está seguro de que el comando no se ejecutó correctamente en el servidor?

En cualquier caso, una posible solución sería utilizarnohup:

nohup rm -rf dirname

Puede ejecutar el comando y cerrar sesión; continuará en segundo plano.


ACTUALIZAR:

encontréesta preguntaEn U&L.SE, te recomiendo que le eches un vistazo. Desafortunadamente, no puedo recrear su problema. Creé un directorio con 2516007 archivos y siempre pude eliminarlo usando rm -rf:

$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l 
  2516007     <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
  real  23m11.695s
  user  0m3.540s
  sys           0m42.891s

Entonces, tomó 20 minutos eliminar ~2 millones de archivos vacíos. Parece razonable que se puedan tardar horas en eliminar una gran cantidad de archivos que no están vacíos.

De todos modos, algunas de las sugerencias de la pregunta de U&L deberían ayudar. En concreto este:

find /delb -type f  --delete

o este (ligeramente modificado del original)

find /delb -type f -print0 | xargs -0r rm -f

Finalmente, un truco que puedes hacer es eliminar algunos archivos a la vez. Si sabe que algunos nombres de archivos comienzan con la cadena "foo", otros "bar", etc., haga esto:

rm -rf /delb/foo*
rm -rf /delb/bar*

etcétera. También puedes probar algo como esto:

for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done

Este último comando eliminará secuencialmente cada nombre de archivo que comience con cada letra del alfabeto y luego cualquier nombre de archivo que comience con números.

Respuesta2

Como complemento a la respuesta ya publicada. Según mi experiencia al tratar con sistemas de archivos que se quedaron sin inodos. Con más de mil millones de archivos en el sistema de archivos.

La forma más rápida de eliminar/enumerar archivos es usar buscar, especialmente si tiene miles de archivos/directorios. Find comienza a funcionar inmediatamente siempre que no haya que realizar ninguna expansión.

buscar /ruta/a/ser/eliminado -tipo f --delete

No utilice *ningún otro tipo de expansión de línea de comando como parte de su comando. *se ejecuta en la terminal antes de pasar al comando rm / ls, etc. Entonces su terminal se queda ahí tratando de enumerar todos los cien mil archivos antes de pasarlos al comando real que hará el trabajo. Esto es muy lento.

man bash
...
EXPANSIÓN
La expansión se realiza en la línea de comando después de dividirla en palabras. Se realizan siete tipos de expansión: expansión de llaves, expansión de tilde, expansión de parámetros y variables, sustitución de comandos, expansión aritmética, división de palabras y expansión de nombres de rutas.
...

información relacionada