
Un programa mal probado creó un directorio en un recurso compartido NFS con una enorme cantidad de archivos, que necesito eliminar.
ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo
El directorio está ubicado en un montaje NFS de aproximadamente 600 GB en un dispositivo tipo netapp. En realidad, no tengo idea de cuántos archivos hay en él, pero un directorio similar creado después de solo 10 minutos tiene 121.000 archivos, por lo que probablemente sean millones en alguna parte. El sistema operativo es el kernel Linux 2.6.
Tratando de encontrar una manera de enumerarlo o eliminarlo y su contenido. find /home/foo da como resultado que find muera después de aproximadamente 1 hora, sin otra salida que "./"
Respuesta1
(respondiendo a mi propia pregunta en caso de que alguien lo encuentre mientras busca algo similar). Posiblemente haya hasta 9 millones de archivos en el directorio.
Desafortunadamente, no puedo iniciar sesión directamente en el servidor, es un dispositivo. El único acceso a los sistemas de archivos es mediante exportación.
rm -rf no pareció funcionar. mirando con la mirada que estaba colgando.
El hallazgo no se completó, murió sin error.
ls -1 nunca pareció completarse. (Ahora me doy cuenta de que intenta ordenar los resultados, ls -1f podría haber funcionado eventualmente).
lo que funcionó fue un simple fragmento de Perl. Supongo que el código C haría lo mismo.
opendir( my $dh, '/home/foo' ) or die $!
while ( my $file = readdir $dh ) {
print "$file\n";
}
Respuesta2
Este hilo bastante antiguo apareció en Google, así que me gustaría compartir algunas estadísticas.
Aquí hay una comparación de tres métodos diferentes para eliminar archivos en un servidor NFS:
- habitación sencilla:
rm dir/*
- encontrar:
find dir/ -type f -exec rm {} \;
- sincronización:
tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir
Para comparar estos métodos, creé 10000 archivos cada vez que ejecuté una prueba con
for i in {1..10000} ; do touch $i ; done
Los resultados del gráfico muestran que rsync es mucho más rápido y find es el más lento de los tres métodos.
Los resultados se mantienen cuando se duplica la cantidad de archivos (no ejecuté find
20000 archivos), el tiempo promedio fue de 3 ejecuciones para 10000 archivos y 2 ejecuciones para 20000 archivos.
10000 20000
find 28.3 -
rm 12.9 23.9
rsync 6.94 12.2
Es interesante ver de qué más depende el rendimiento de estos métodos.
un relacionadocorreoEn este sitio se analiza la eliminación de una gran cantidad de archivos en un sistema de archivos ext3.
Respuesta3
Le sugeriría que NO intente eliminar estos archivos a través de NFS: inicie sesión directamente en el servidor de archivos y elimine los archivos allí. Esto será sustancialmente menos abusivo para el servidor NFS (y el cliente).
Más allá de eso, use buscar (como lo describe MattBianco) o use ls -1 | xargs rm -f
(desde ese directorio) si la búsqueda tiene problemas para completarse (este último debería funcionar bien en NFS, aunque nuevamente recomendaría hacerlo localmente).
Respuesta4
Esto parece un poco obvio, pero ¿has probado?
rm -rf /home/foo/
? De lo contrario, ¿hay alguna forma de utilizar una expresión regular para tener a mano un subconjunto lo suficientemente pequeño |xargs rm
?
Si ls falla, puede intentarlo echo /home/foo/* | xargs rm
, pero podría fallar con "línea demasiado larga" o algo similar. Ah, y apoyo la recomendación de intentar hacer esto directamente en el servidor en lugar de a través de NFS.