Mareos de un geek

Mens Geek in Corpore Insano

Menú Cerrar

rm extremo

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.