Cómo modificar la fecha de las carpetas en linux (y algunos extras)

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 "http://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 "http://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”.

Esta entrada fue publicada en Divulgacion, Linux. Guarda el enlace permanente.

Una respuesta a Cómo modificar la fecha de las carpetas en linux (y algunos extras)

  1. Pingback: Cómo modificar la fecha de las carpetas en linux (y algunos extras) | Tech News

Deja un comentario