jueves, 27 de febrero de 2014

(Solucion) Al problema : "/bin/rm: Argument list too long"

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

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: