Producto de una experiencia reciente, me permito compartir otra que (supongo) puede ser de utilidad para probar nuestros scripts en bash cuando se trata de procesar archivos o carpetas basado en su fecha de creación/modificación.
Supongamos que necesitamos eliminar las carpetas con 10 o más días de antigüedad… Pero no tenemos dichas carpetas, ni vamos a esperar 10 o más días para tener un lote de prueba…
Aquí una posible solución:
#!/bin/bash # Utilizo un contador de 11 a 20, xq necesito 10 casos # con 10 o más días de antigüedad # NB: Son 10 casos, del 11 al 20 for i in `seq 11 20`; do # Almaceno la fecha de hace i días en FECHA FECHA=$(date +"%Y%m%d" -d "$i day ago") # Creo una carpeta con la fecha como nombre # NB: el parámetro -p ignora el error si la carpeta ya existe mkdir -p "pruebas/$FECHA" # La magia: con touch editamos la fecha de modificación # de la carpeta/archivo touch -d "$FECHA" "mysql/$FECHA" done
Al finalizar, tendremos dentro de «pruebas» 10 carpetas cuyo nombre y fecha coinciden con el rango de fechas de hace 11 días hasta 20 días atrás.
Luego, pude probar el script que estaba haciendo… En particular esta línea:
#!/bin/bash ... # Limpiemos lo viejo find /home/pepe/pruebas/. -type d -mtime +10 | xargs rm -rf # find Buscar # -type d Directorios # -ctime Con una antigüedad mayor a 10 días # xargs rm -rf Eliminarlos según listado por find ...
Y así, el script entró en funcionamiento sin fallas…
Algunos datos interesantes:
- No existe en linux algo como la fecha de creación (no como se puede interpretar a la primera)
- La que importa es la fecha de modificación, y esto en las carpetas tiene relevancia pues se actualiza según la última fecha en que se creó un archivo en su interior
- Otras dos fechas que registra linux son: la de acceso (access) y la de cambio (changed)
Esto último se pone más interesante cuando, buscando y rebuscando, me encuentro con esta aclaración sobre los «timestamp» que utiliza linux:
- Access: (acceso) la última fecha en que el archivo fue leído
- Modified: (modificado) la última fecha en que fue alterado su contenido
- Changed: (cambiado) la última fecha en que se modificaron los metadatos (permisos, propietario, grupo, etc)
Ejemplo: (la salida ha sido modificada para facilitar la lectura)
$ echo "RECURSOS PARA FORMACION" > archivo.txt $ stat archivo.txt Fichero: «archivo.txt» Tamaño: 24 Bloques: 8 Bloque E/S: 4096 fichero regular Dispositivo: 802h/2050d Nodo-i: 2101470 Enlaces: 1 Acceso: (0664/-rw-rw-r--) Uid: ( 1000/pepe) Gid: ( 1000/pepe) Acceso: 2016-05-04 18:48:40.434951419 -0300 Modificación: 2016-05-04 18:48:40.434951419 -0300 Cambio: 2016-05-04 18:48:40.434951419 -0300 Creación: -
He creado un archivo, y las tres entradas son idénticas…
Ahora, provocaré que cambie sólo la fecha de acceso
$ cat archivo.txt RECURSOS PARA FORMACION $ stat archivo.txt Fichero: «archivo.txt» Tamaño: 24 Bloques: 8 Bloque E/S: 4096 fichero regular Dispositivo: 802h/2050d Nodo-i: 2101470 Enlaces: 1 Acceso: (0664/-rw-rw-r--) Uid: ( 1000/pepe) Gid: ( 1000/pepe) Acceso: 2016-05-04 18:48:57.016105855 -0300 <---- Modificación: 2016-05-04 18:48:40.434951419 -0300 Cambio: 2016-05-04 18:48:40.434951419 -0300 Creación: -
Se ha modificado, sólo por leer el archivo, la fecha de «Acceso»
Ahora, modificaré…
$ echo "https://recursosformacion.com" >> archivo.txt $ stat archivo.txt Fichero: «archivo.txt» Tamaño: 53 Bloques: 8 Bloque E/S: 4096 fichero regular Dispositivo: 802h/2050d Nodo-i: 2101470 Enlaces: 1 Acceso: (0664/-rw-rw-r--) Uid: ( 1000/pepe) Gid: ( 1000/pepe) Acceso: 2016-05-04 18:48:57.016105855 -0300 Modificación: 2016-05-04 18:49:14.508106298 -0300 <---- Cambio: 2016-05-04 18:49:14.508106298 -0300 <---- Creación: -
Han cambiado «Modificación» y «Cambio»…
Ahora cambiaremos los «metadatos»
$ chmod 666 archivo.txt $ stat archivo.txt Fichero: «archivo.txt» Tamaño: 53 Bloques: 8 Bloque E/S: 4096 fichero regular Dispositivo: 802h/2050d Nodo-i: 2101470 Enlaces: 1 Acceso: (0666/-rw-rw-rw-) Uid: ( 1000/pepe) Gid: ( 1000/pepe) Acceso: 2016-05-04 18:48:57.016105855 -0300 Modificación: 2016-05-04 18:49:14.508106298 -0300 Cambio: 2016-05-04 18:49:39.464106931 -0300 <---- Creación: -
Sólo cambió «Cambio»…
Hasta aquí, lo que ocurre con un fichero… Pero, ¿Qué ocurre con las carpetas/directorios?Recordemos que el concepto en linux es que TODO es un archivo, absolutamente TODO…
Ahora, a los papeles…
$ mkdir RecursosParaFormacion $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 1000/ pepe) Gid: ( 1000/ pepe) Acceso: 2016-05-04 19:34:25.888174993 -0300 Modificación: 2016-05-04 19:34:25.888174993 -0300 Cambio: 2016-05-04 19:34:25.888174993 -0300 Creación: - $ ll RecursosParaFormacion/ total 24 drwxrwxr-x 2 pepe pepe 4096 may 4 19:34 ./ drwxr-xr-x 176 pepe pepe 20480 may 4 19:34 ../ $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 1000/ pepe) Gid: ( 1000/ pepe) Acceso: 2016-05-04 19:34:59.776175851 -0300 <---- Modificación: 2016-05-04 19:34:25.888174993 -0300 Cambio: 2016-05-04 19:34:25.888174993 -0300 Creación: -
Luego de crear la carpeta, al listar su contenido, vemos que se modificó «Acceso»
$ echo "https://recursosformacion.com" > RecursosParaFormacion/enlace.txt $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 1000/ pepe) Gid: ( 1000/ pepe) Acceso: 2016-05-04 19:34:59.776175851 -0300 Modificación: 2016-05-04 19:35:56.460177287 -0300 <---- Cambio: 2016-05-04 19:35:56.460177287 -0300 <---- Creación: -
Creo un archivo dentro de esa carpeta y, como antes, se modifican «Modifiación» y «Cambio»…
Cambiamos propietario y grupo, de un archivo interno…
$ sudo chown nobody:nogroup RecursosParaFormacion/enlace.txt [sudo] password for pepe: $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 1000/ pepe) Gid: ( 1000/ pepe) Acceso: 2016-05-04 19:36:57.444178832 -0300 <---- Modificación: 2016-05-04 19:35:56.460177287 -0300 Cambio: 2016-05-04 19:35:56.460177287 -0300 Creación: -
Ahora, a diferencia de lo ocurrido antes, sólo cambia «Acceso»…
¿Y si cambio a la carpeta?
$ sudo chown nobody:nogroup RecursosParaFormacion $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 990/ nobody) Gid: (65534/ nogroup) Acceso: 2016-05-04 19:36:57.444178832 -0300 Modificación: 2016-05-04 19:35:56.460177287 -0300 Cambio: 2016-05-04 19:38:11.900180719 -0300 <---- Creación: -
Sólo cambia «Cambio», tal como hizo con el archivo…
¿Qué pasará si eliminamos el archivo?
$ sudo rm RecursosParaFormacion/enlace.txt $ stat RecursosParaFormacion/ Fichero: «RecursosParaFormacion/» Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio Dispositivo: 802h/2050d Nodo-i: 5115273 Enlaces: 2 Acceso: (0775/drwxrwxr-x) Uid: ( 990/ nobody) Gid: (65534/ nogroup) Acceso: 2016-05-04 19:38:43.848181528 -0300 <---- Modificación: 2016-05-04 19:38:53.204181765 -0300 <---- Cambio: 2016-05-04 19:38:53.204181765 -0300 <---- Creación: -
Ahora, secuencialmente, se accedió, luego queda el registro de la «Modificación» y el lógico «Cambio»…
La intención era, en un principio, explicar cómo cambiar la fecha de una carpeta (o archivo, da igual) y terminamos entendiendo cómo linux registra los cambios según sean…
Al menos es un dato útil si se quiere investigar quién y desde dónde se modificó un archivo… Lamentablemente eso no se almacena, al menos por defecto…
De querer averiguarlo, habría que hacer otra entrada al respecto y ya nos vamos contra «informática forense».
8 comentarios
Gracias por el artículo.
Aquí mas ejemplos del comando touch:
https://www.sysadmit.com/2018/05/linux-cambiar-fecha-de-creacion-archivo.html
Gracias por el artículo.
Aquí mas ejemplos del comando touch:
https://www.sysadmit.com/2018/05/linux-cambiar-fecha-de-creacion-archivo.html