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.
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.
Recuerde que, en general, Linux es compatible con POSIX, lo que requiere ciertos atributos de archivo. En particular,
- 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.
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 pruebaCreamos 500000 archivos .txt con un sencillo loop en bash en el directorio actual.
$for i in $(seq 1 500000); do echo testing >> $i.txt; doneYa 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.743sPodemos 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.441sVemos 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.403sEs 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.649sVemos que elimina todos los archivos en casi 3 minutos y los recursos usados son menores comparados a los anteriores.
Que útil Jonathan, me ha gustado mucho, ya me pegué con un tema de estos. gracias.