Cargando



Manera más rápida de eliminar una gran cantidad de archivos de Unix, Linux

Esta vez traigo algunas maneras de borrar una gran cantidad de archivos, cuando tienes un entorno de produccion con archivos desechables, o al momento de hacer limpiezas en tus servidores.


sep 21 2015 21:45
Profesional
mar 02 2016 21:40

Crear, eliminar y modificar archivos es una de las tareas mas comunes para los administradores de sistemas. Este tipo de tareas se hace con frecuencia en tu día a día, puede ser algo rápido cuando son uno o dos archivos pero la cosa se complica cuando el numero aumenta.

 

Si la cantidad de archivos es de mas de 6 dígitos debemos de tener mucho cuidado porque puedes tardarse una eternidad, e incluso colgar todo el sistema, recomiendo saber abordar la tarea y usar el comando que mas convenga dependiendo tu Filesystem y sobretodo la cantidad archivos.

 

Cuando hablamos de los archivos en linux, todo se basa en los inodes mas que en los archivos podemos empezar hablando de ellos.

 

Qué es un Inodo

Es una estructura de datos propia de los sistemas de archivos tradicionalmente empleados en los sistemas operativos tipo UNIX como es el caso de Linux. Un inodo contiene las características (permisos, fechas, ubicación, pero NO el nombre) de un archivo regular, directorio, o cualquier otro objeto que pueda contener el sistema de ficheros.

 

Cómo se crean los inodos e incluso si son creados, depende del sistema de archivos específico. Varios sistemas de archivos crean todos los inodos cuando el sistema de archivos mismo es creado lo cual resulta en un número fijo de inodos. Por ejemplo, ext3 es un sistema de archivos que hace esto. El resultado es que el sistema de archivos tiene un número determinado de archivos que pueden almacenarse. Sí - en realidad es posible tener la capacidad en el medio de almacenamiento y no ser capaz de almacenar más datos . Si necesita más inodos tendrá que rehacer el sistema de archivos perdiendo todos los datos en el mismo.

 

Una forma de evitar la trampa del número fijo de inodes es algo utilizado por algunos sistemas de archivos y que es llamado localización y / o extensión dinámica a de inodos. Estos sistemas de archivos, básicamente, puede hacer crecer el sistema de archivos y / o aumentar el número de inodos.

 

Composición de un Inodo

Recuerde que, en general, Linux es compatible con POSIX, lo que requiere ciertos atributos de archivo. En particular,

 

El tamaño del archivo en bytes
  • ID de dispositivo
  • ID de usuario del archivo
  • ID de grupo del archivo
  • El modo de archivo que determina el tipo de archivo y la forma en que el propietario, grupo y otros (el resto) pueden acceder al archivo
  • Banderas adicionales de sistema y usuario para proteger aún más el archivo (nota: esto puede ser usado para limitar el uso y modificación de los archivos)
  • Marcas de tiempo que especifican cuando ha sido modificado por última vez el inodo mismo (ctime, "change time"), cuando el contenido del archivo fue modificado por última vez (mtime "modification time"), y cuando fue accedido el archivo por última vez (atime "access time")
  • Un contador de enlace que indica cuántos enlaces duros apuntan al inodo.
  • Punteros a los bloques del disco que almacenan el contenido del archivo.

 

Cualquier sistema de archivos de Linux que sea compatible con POSIX debe tener esta información contenida en el inodo para cada archivo o ser capaz de reproducir esta información como si hubieran inodos.

 

Eliminando archivos en Linux

La velocidad para mover, modificar o eliminar un archivo depende de la cantidad de inodes y el comando a utilizar.

 

Generando el entorno de Pruebas


Crearemos un pequeño laboratorio creando un directorio y generaremos 500.000 archivos dentro de el y los eliminaremos con algunos comandos y veremos su velocidad.

 

Creamos el directorio:

$ mkdir prueba
Creamos 500000 archivos .txt con un sencillo loop en bash en el directorio actual.
$for i in $(seq 1 500000); do echo testing >> $i.txt; done
Ya estará creado.

 

Usando el comando rm


Empezamos con el comando mas sencillo en linux
$ time rm -f *
Al ser un numero de archivos muy grande el comando rm no nos sirve para esta tarea arrojando el error.
-bash: /bin/rm: Argument list too long

Usando el comando Find


Esta vez haremos la misma prueba pero usando find con el argumento -exec
$ time find /prueba/ -type f -exec rm {} \;
real 14m51.735s
user 2m24.330s
sys 9m48.743s
Podemos ver que se completo el comando en un tiempo de casi 15 minutos.
Usaremos el mismo comando find pero con la opción -delete
$ time find /prueba/ -type f -delete
real 5m11.937s
user 0m1.259s
sys 0m28.441s
Vemos que nuevamente pudo borrar todos los archivos pero esta vez mucho mas rápido en poco mas de 5 minutos un excelente tiempo tomando en cuenta que son casi medio millón de archivos.

 

Usando Perl


Esta vez usaremos el lenguaje perl para eliminar todos los archivos en el directorio.
time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real 1m0.488s
user 0m7.023s
sys 0m27.403s
Es extremadamente rápido comparado con los anteriores, pero su consumo es algo elevado tener cuidado con este comando, tiendo a usar perl para eliminar archivos, pero en scripts que corran en horarios sin mucho trafico o puedes colgar el sistema por falta de recursos.

 

Usando RSYNC


Para finalizar usaremos la herramienta numero 1 para respaldo RSYNC, que aunque no lo creas puede ser usado para eliminar archivos. Para esta prueba sincronizaremos la carpeta prueba con una nueva totalmente vacía.
$ time rsync -a --delete vacio/ prueba/
real 2m52.502s
user 0m2.772s
sys 0m32.649s
Vemos que elimina todos los archivos en casi 3 minutos y los recursos usados son menores comparados a los anteriores.

 

Conclusiones
Hemos visto varias opciones que pueden ser aplicadas según sea el caso, en caso de realizar búsqueda con filtros usar perl puede ser un problema si no lo dominas del todo, mientras el comando find con la opción -delete es bastante rapido espero les sirva de ayuda en un futuro y si tienen otro método déjalo en los comentarios.


¿Te ayudó este Tutorial?


6 Comentarios


Julio Arroyo
sep 22 2015 19:48

Que útil Jonathan, me ha gustado mucho, ya me pegué con un tema de estos. gracias.

jo jo jo que bueno este tutorial estaba cansado de este mensaje Argument list too long. ;)


Jonathan Carrillo
sep 22 2015 21:02

Gracias, en este tema tuve que profundizar hace poco, un cliente requeria eliminar 3 millones de archivos cada 3 dias usando algunos filtros por tamaño. Si usan perl con renice de 5 queda bastante estable sin perder mucha velocidad. 

Gracias, en este tema tuve que profundizar hace poco, un cliente requeria eliminar 3 millones de archivos cada 3 dias usando algunos filtros por tamaño. Si usan perl con renice de 5 queda bastante estable sin perder mucha velocidad. 

 

Esto es super útil!!!!!! que buena forma de hacerlo. Lo voy a compartir con un pro IT que se pegó con esto el otro día. Gracias Jonathan, eres un crack. saludos.


Veronica Nicas
sep 25 2015 23:53

Esto es muy muy interesante. Salva mucho tiempo esta forma de hacerlo. No la conocía a fondo. gracias.

Fabuloso.

Eliminar cientos de miles o millones de ficheros pequeños de un disco de 4TB lleno hasta arriba a través de un puerto USB:

conrmentre 3 y 4 horas.

conrsync¡¡¡¡7 minutos!!!!! :-D

¡Gracias!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

Hola! Si no encuentras algún tutorial en el buscador de Solvetic, Solicítalo Aquí

X