Tenía un directorio completo con millones de imágenes gif. Demasiados para el comando rm.
He estado probando el comando find así:
find . -name "*.gif" -print0 | xargs -0 rm
El problema es que bloquea mi máquina realmente mal y causa tiempos de espera para los clientes, ya que es un servidor.
¿Hay alguna forma que sea más rápida de eliminar todos estos archivos ... sin bloquear la máquina?
rm -rf
sería más rápido Vale la pena intentarlo..Respuestas:
Más rápido no es necesariamente lo que quieres. Es posible que desee ejecutar más lentamente , por lo que la eliminación consume menos recursos mientras se ejecuta.
Use nice (1) para reducir la prioridad de un comando.
Para los procesos vinculados a E / S, nice (1) podría no ser suficiente. El planificador de Linux tiene en cuenta las E / S, no solo la CPU, sino que es posible que desee un control más preciso sobre la prioridad de E / S.
Si eso no lo hace, también puede agregar un sueño para realmente ralentizarlo.
fuente
sleep
adición: estaba teniendo problemas con los servidores que se ahogaban en el IO a pesar de usarloionice -c 3
. Se agrega significativamente al tiempo que lleva borrar los archivos (por supuesto), pero prefiero esperar antes de cerrar la aplicación ...Como está ejecutando Linux y esta tarea probablemente esté vinculada a E / S, le aconsejo que otorgue a su comando prioridad de programación de E / S inactiva mediante
ionice(1)
:En comparación con su comando original, supongo que esto incluso puede ahorrar más ciclos de CPU al evitar la tubería
xargs
.fuente
find ... -exec
donde eso tendría sentido.find(1)
documentación dice que sí. :) Y debería ser obvio que permitirsefind
eliminar archivos es más eficiente que bifurcar unrm
comando para esto.ionice -c3
baja el prio para que simplemente se ejecute cuando el IO está inactivo, de lo contrario, esto es perfecto. Tenga en cuenta que, dado que-delete
no es estándar para la búsqueda, puede hacer lo mismo (incluida la retroalimentación de que funciona) con este comando:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Lento pero sin espera de procesos importantes.No.
No hay una forma más rápida, aparte del formato suave del disco. Los archivos se entregan a rm a la vez (hasta el límite de la línea de comando, también se puede establecer en
xargs
), lo cual es mucho mejor que llamar a rm en cada archivo. Entonces no, definitivamente no hay una forma más rápida.El uso
nice
(orenice
en un proceso en ejecución) ayuda solo parcialmente, porque eso es para programar el recurso de la CPU , ¡no el disco! Y el uso de la CPU será muy bajo. Esta es una debilidad de Linux: si un proceso "come" el disco (es decir, funciona mucho con él), toda la máquina se atasca. El kernel modificado para uso en tiempo real podría ser una solución.Lo que haría en el servidor es permitir manualmente que otros procesos hagan su trabajo, incluidas pausas para mantener el servidor "respirando":
Esto esperará 5 segundos después de cada 100 archivos. Tomará mucho más tiempo, pero sus clientes no deberían notar demoras.
fuente
rm *
, se expande*
en la línea con todos los nombres de archivo y se los pasarm
? Eso es increíblemente estúpido. ¿Por qué shell expand comodines?*
o/*
y dar una duda a dicha decisión del usuario.Si la cantidad de archivos que se van a eliminar supera ampliamente a los archivos que quedan, puede que no sea el enfoque más eficiente para recorrer el árbol de archivos que se eliminarán y hacer todas esas actualizaciones del sistema de archivos. (Es análogo a hacer torpe gestión de memoria contada por referencia, visitar cada objeto en un árbol grande para soltar su referencia, en lugar de hacer que todo lo no deseado se convierta en basura en un solo paso, y luego barrer lo que es accesible para limpiar).
Es decir, clonar las partes del árbol que se deben mantener en otro volumen. Vuelva a crear un sistema de archivos nuevo y en blanco en el volumen original. Copie los archivos retenidos a sus rutas originales. Esto es vagamente similar a copiar la recolección de basura .
Habrá algún tiempo de inactividad, pero podría ser mejor que el mal desempeño continuo y la interrupción del servicio.
Puede ser poco práctico en su sistema y situación, pero es fácil imaginar casos obvios en los que este es el camino a seguir.
Por ejemplo, suponga que desea eliminar todos los archivos en un sistema de archivos. ¿Cuál sería el punto de recurrir y eliminar uno por uno? Simplemente desmóntalo y haz un "mkfs" sobre la partición para crear un sistema de archivos en blanco.
¿O suponga que desea eliminar todos los archivos, excepto media docena de archivos importantes? Saca la media docena de allí y ... "mkfs" por encima.
Eventualmente, hay un punto de equilibrio cuando hay suficientes archivos que deben permanecer, que se vuelve más barato hacer la eliminación recursiva, teniendo en cuenta otros costos como cualquier tiempo de inactividad.
fuente
Has probado:
El signo + al final hará que find incluya más archivos para que se ejecute el único comando rm. Revise esta pregunta para más detalles.
fuente
-delete
) que no siempre tiene que estar allí ...