3 votos

Grupo de las fechas de modificación de aleatorizar

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

Si eso no tenía sentido, aquí está una captura de pantalla de un ejemplo de directorio. El objetivo es cambiar la fecha de modificación hasta la fecha en el contenido de la carpeta y hacer lo mismo con el resto de los contenidos de la carpeta con la fecha diferente.

Example directory

Sé que es posible tocar varios archivos de una sola vez mediante el uso de touch -t YYYYMMDDhhmm file1 file2 file3, sin embargo hay una manera de automatizar este proceso con una fecha al azar?

5voto

Michael Zhou Puntos 167

Esta es una petición inusual. No estoy seguro de por qué se quiere hacer esto, pero se despertó mi interés. Utilizaremos jot a recogernos para un número al azar entre 1 y 16000.

jot -r 1 1 16000

Este será el número de horas que le restan a partir 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 por encima de, los formatos de la fecha de trabajar con el tacto.

Ahora vamos a utilizar find listar todos los directorios dentro del directorio de trabajo actual y el uso de una "inline" secuencia de comandos para tocar todos los objetos del sistema de archivos dentro de cada directorio con una modificación única vez 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 todavía, porque tenemos indiscriminadamente a los cambios de la modificación de directorios anidados. Queremos único mod veces 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 puede fallar si se excede ARG_MAX y en la actualidad solamente una lista de los cambios que toque. Usted puede quitar el echo frente a touch para realizar los cambios. Por favor, ser conscientes de que esta secuencia de comandos sólo se ha limitado a pruebas y se ofrece COMO es.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X