Primera aclaración ¿qué es rm? Pues es ni más ni menos que un comando de la consola y/o terminal de los sistemas Unix (leasé Linux, MacOSX, FreeBSD, etc.) Básicamente, nos permite borrar ficheros y directorios. Vamos lo que todo el mundo en su sistema Windows hace seleccionando la carpeta o el icono del archivo y pulsando la tecla de Suprimir.
Ahora que ya ha quedado claro qué es y para qué se usa, veamos el problema. Según parece y por limitaciones que impone el kernel (núcleo del sistema operativo) este comando tiene una capacidad máxima de parámetros. De forma rápida, un parámetro es un valor que interviene en la ejecución de un programa.
Para ejecutar el comando (programa que se localiza en /bin/rm) rm es necesario indicarle una serie de parámetros, entre ellos, el nombre o ruta de los ficheros a eliminar. Un ejemplo básico.
rm -rf /usr/home/anix/musica
En este caso, los parámetros son dos, primero -rf, son parámetros que determinarán el comportamiento del programa. El segundo parámetro indica la ruta del directorio a borrar.
Hasta aquí todo ha sido muy sencillo, el problema surge cuando decides borrar el contenido de un directorio con el parámetro * (se sustituirá durante la ejecución por los nombres de todos los ficheros existentes en el directorio) y el número de ficheros es muy elevado.
Ahí quería yo llegar.
Esta mañana he tenido que borrar el contenido de un directorio que contenía nada más y nada menos que unos 250.000 ficheros (unos 2 GB de suculento spam) Por supuesto, ejecutar rm -f *(se utiliza para borrar todos los ficheros sin preguntar, vamos que tiene un peligro) me ha devuelto un bonito mensaje de error.
/bin/rm: Argument list too long
¿Muy larga? ¿Cuánto de larga?
ls -1 | wc -l
251587
Vale, tiene unos pocos argumentos.
Si se googlea un poco pueden obtenerse diversas soluciones, normalmente basadas en scripts o en tuberias (ésto lo eplicaré otro día)
La solución que más me ha convencido y que al final he acabado utilizando ha sido la que puede encontrarse en esta página.
No me refiero a la primera que consiste en subir un nivel en el árbol de directorios y eliminar el directorio que contiene la marabunta de ficheros.
Me refiero a utilizar el comando find explotando sus posibilidades un poquito más de lo normal.
find . -exec rm {} ;
Después de 15 minutos, directorio borrado y ficheros enviados al infierno de los spammers (/dev/null)
Por si no queda claro, tienes un directorio con miles de ficheros y al ejecutar el comando rm obtienes un bonito /bin/rm: Argument list too long por respuesta. Entonces, te situas dentro de ese directorio y ejecutas find . -exec rm {} ; En cuestión de minutos, el asunto, podrá darse por solucionado.
7 comentarios
Buen truco, Esteban. No lo había pensado nunca, pero tampoco tuve nunca la necesidad de usarlo.
Saludos.
Y yo que pensaba que por rm extremo iba a encontrar algo como:
#nohup rm -Rf / &
Y supongo que hacer un mv * /dev/null da el mismo problema, no?
shalafi imagino que sí, que el mv tendrá el mismo problema, porque según he leido por ahí no se trata de un error de rm si no de una limitación del propio kernel (al menos en BSD)
No está mal… aunque el rm es el comando más peligroso de los Linux jejeje… que se lo digan a Chuchi y su rm -r /etc ;)
Umm, pero falta la f para que no te pregunte, no? xDDD
Ouu extremo y muy practico
Como se podría emplear el ejemplo si en lugar de eliminar se desea copiar los 80,000 archivos de un directorio a otro y al intentar cp -r directorio/* directorio2/ da el mismo error: Argument list too long?
Saludos