Randomize grupo de fechas de modificación

2

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 uno modifique el contenido de cualquier carpeta. La fecha es 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.

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

    
pregunta MrU 29.05.2018 - 15:22

1 respuesta

5

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

jot -r 1 1 16000

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

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

Tenga en cuenta que date arriba, formatea la fecha para trabajar con el toque.

Ahora usamos find para 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 cambiamos indiscriminadamente los tiempos de modificación de los directorios anidados. Queremos tiempos únicos de modificación 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 {} \; 

Esta secuencia de comandos podría fallar si supera ARG_MAX y actualmente solo mostrará una lista de los cambios que tocaría. Puede eliminar echo delante de touch para realizar los cambios. Tenga en cuenta que este script solo tiene pruebas limitadas y se ofrece TAL CUAL.

    
respondido por el fd0 29.05.2018 - 19:50

Lea otras preguntas en las etiquetas