EL PROBLEMA
Me ha pasado en ocaciones cuando quiero borrar miles de archivos dentro de un directorio (rm /mi/directorio/*" obtengo el error:
/bin/rm: Argument list too long
Esto nos indica que la cantidad de archivos es muy grande y no puede gestionarla (wtf?)
LA CAUSA
La causa es una limitación del buffer de la función exec() la cual es de 128K, y esta funcion está utilizada en muchos otros programas como , ls, rm, du ...
El limite afecta la funcion execve() del kernel, la cual es usada por las funciones exec() (execl, execlp, execle,etc). La funcion trabaja creando un buffer de 128k al final del espacio de memoria y copiando el comando y el entorno para el nuevo proceso en este espacio. En ese momento el kernel carga el nuevo programa en memoria, configura sus punteros argv y endv, y salta al punto de entrada del programa. El mensaje de error "argument list too long" es causado por el codigo de error !E2BIG, siendo devuelto por la funcion execve(), cuando es incapaz de introducir el argumento y entorno suministrados dentro del buffer de 128k.
LA SOLUCIÓN
La técnica que soluciona esto es seleccionar archivo por archivo . pensarías que esto no es viable ya que tendrías que borrar miles de archivos a mano y tardarías años en realizar este proceso
Para borrar de uno en uno sin hacerlo manualmente podemos hacer un bucle for (ciclo) que seleccione a cada archivo y le aplique el comando rm
También se puede haciendo una búsqueda de todos los archivos y aplicar a cada uno que vaya encontrando el comando rm
y listo, con esto podemos borrar de manera masiva miles de archivos sin problemas :D
Me ha pasado en ocaciones cuando quiero borrar miles de archivos dentro de un directorio (rm /mi/directorio/*" obtengo el error:
/bin/rm: Argument list too long
Esto nos indica que la cantidad de archivos es muy grande y no puede gestionarla (wtf?)
LA CAUSA
La causa es una limitación del buffer de la función exec() la cual es de 128K, y esta funcion está utilizada en muchos otros programas como , ls, rm, du ...
El limite afecta la funcion execve() del kernel, la cual es usada por las funciones exec() (execl, execlp, execle,etc). La funcion trabaja creando un buffer de 128k al final del espacio de memoria y copiando el comando y el entorno para el nuevo proceso en este espacio. En ese momento el kernel carga el nuevo programa en memoria, configura sus punteros argv y endv, y salta al punto de entrada del programa. El mensaje de error "argument list too long" es causado por el codigo de error !E2BIG, siendo devuelto por la funcion execve(), cuando es incapaz de introducir el argumento y entorno suministrados dentro del buffer de 128k.
LA SOLUCIÓN
La técnica que soluciona esto es seleccionar archivo por archivo . pensarías que esto no es viable ya que tendrías que borrar miles de archivos a mano y tardarías años en realizar este proceso
Para borrar de uno en uno sin hacerlo manualmente podemos hacer un bucle for (ciclo) que seleccione a cada archivo y le aplique el comando rm
for i in ls /mi/directorio/*; do rm -v $i -f; done
También se puede haciendo una búsqueda de todos los archivos y aplicar a cada uno que vaya encontrando el comando rm
find . -name '*' | xargs rm
y listo, con esto podemos borrar de manera masiva miles de archivos sin problemas :D
No hay comentarios:
Publicar un comentario