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:

Esto último se pone más interesante cuando, buscando y rebuscando, me encuentro con esta aclaración sobre los «timestamp» que utiliza linux:

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

Deja un comentario