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.
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?
Esta es una solicitud inusual. No estoy seguro de por qué querrías 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 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 date
arriba, formatea la fecha para trabajar con 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 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 echo
delante de touch
para hacer los cambios. Tenga en cuenta que este script solo tiene pruebas limitadas y se ofrece TAL CUAL.
touch
requerían, sin embargo, fue fácil eliminarlo %S
para solucionarlo.ksh
la función de fecha en el uso del date
comando externo para bash
.
IconoDaemon
Señor U