Grupo aleatorio de fechas de modificación

Tengo varios archivos que tienen la misma fecha de modificación en una carpeta, y me gustaría cambiar la fecha de todos los archivos dentro de esa carpeta, y lo mismo con otras carpetas en el directorio para que cada contenido de la fecha de modificación de cualquier carpeta sea diferente a cualquier carpeta.

Si eso no tiene sentido, aquí hay una captura de pantalla de un directorio de ejemplo. El objetivo es cambiar la fecha de modificación a una fecha diferente en el contenido de la carpeta y hacer lo mismo con el contenido de la otra carpeta con fecha diferente.

Directorio de ejemplo

Sé que es posible tocar varios archivos de una sola vez usando touch -t YYYYMMDDhhmm file1 file2 file3, sin embargo, ¿hay alguna forma de automatizar este proceso con una fecha aleatoria?

Una aplicación paga, A Better Finder Attributes puede modificar las fechas de los archivos: A Better Finder Attributes 6 le brinda un control total sobre las fechas de creación y modificación de archivos, configurándolos en horas y fechas específicas, agregando o eliminando tiempo o simplemente eliminándolos por completo. Descargo de responsabilidad: Soy un usuario satisfecho de ABFA. Sin conexiones financieras o de otro tipo con Publicspace.net.
@IconDaemon Gracias por recomendar ABFA, sin embargo, la razón por la que necesito automatizar el proceso es porque tengo muchas carpetas anidadas dentro de otras carpetas similares a este ejemplo de árbol de directorios en la pregunta. Eso, y tener que elegir una fecha manualmente, también puedo usar touch en lugar de ABFA.

Respuestas (1)

Esta es una solicitud inusual. No estoy seguro de por qué querrías hacer esto, pero despertó mi interés. Usaremos jotpara elegirnos un número aleatorio entre 1 y 16000.

jot -r 1 1 16000

Este será el número de horas que restamos de la fecha actual.

seed=$(jot -r 1 1 16000)
date -v-"$seed"H "+%Y%m%d%H%M.%S"

Tenga en cuenta que datearriba, formatea la fecha para trabajar con toque.

Ahora usamos findpara enumerar todos los directorios dentro del directorio de trabajo actual y usamos un script "en línea" para tocar todos los objetos del sistema de archivos dentro de cada directorio con un tiempo de modificación único en cada directorio.

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
    done
' sh {} \;

Aún no hemos terminado porque hemos cambiado indiscriminadamente los tiempos de modificación de los directorios anidados. Queremos tiempos de modificación únicos para cada directorio.

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
    done
' sh {} \;

Y para ponerlo todo junto-

#! /bin/ksh

find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
    done
' sh {} \;


find . ! -name '.' -type d -exec bash -c ' for dir
    do
        seed=$(jot -r 1 1 16000)
        echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
    done
' sh {} \; 

Este script podría fallar si excede ARG_MAX y actualmente solo enumerará los cambios que haría el toque. Puede quitar el echodelante de touchpara hacer los cambios. Tenga en cuenta que este script solo tiene pruebas limitadas y se ofrece TAL CUAL.

¡Maldita leyenda! ¡Solo quería para cada archivo para cada carpeta en un directorio, pero supongo que también tengo la opción de tocar las carpetas! En cuanto a la razón: digamos que reviso estos archivos y con el tiempo puedo predecir lo que vendrá después. Solo un error que se solucionó fácilmente, los números producidos por el generador de fechas no incluían el decimal para los segundos que touchrequerían, sin embargo, fue fácil eliminarlo %Spara solucionarlo.
@MrU Gracias por señalar el error. De alguna manera, el período se perdió al convertir kshla función de fecha en el uso del datecomando externo para bash.