Casuale gruppo di date di modifica

2

Ho diversi file che hanno la stessa data di modifica in una cartella, e vorrei cambiare la data per tutti i file all'interno di quella cartella, e lo stesso con altre cartelle nella directory in modo che ognuno il contenuto della modifica di qualsiasi cartella la data è diversa da qualsiasi cartella.

Se ciò non aveva senso, ecco uno screenshot di una directory di esempio. Lo scopo è quello di modificare la data di modifica in una data diversa sul contenuto della cartella e fare lo stesso con i contenuti della cartella con date diverse.

So che è possibile toccare più file contemporaneamente usando touch -t YYYYMMDDhhmm file1 file2 file3 , tuttavia esiste un modo per automatizzare questo processo con una data casuale?

    
posta MrU 29.05.2018 - 15:22
fonte

1 risposta

5

Questa è una richiesta insolita. Non sono sicuro del perché vorresti farlo ma ha suscitato il mio interesse. Utilizzeremo jot per scegliere un numero casuale compreso tra 1 e 16000.

jot -r 1 1 16000

Questo sarà il numero di ore che sottraiamo dalla data corrente.

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

Tieni presente che date sopra, formatta la data da utilizzare con il tocco.

Ora usiamo find per elencare tutte le directory all'interno della directory di lavoro corrente e usare uno script "in linea" per toccare tutti gli oggetti del filesystem all'interno di ogni directory con un tempo di modifica univoco in ciascuna directory.

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 {} \;

Non abbiamo ancora finito perché abbiamo modificato indiscriminatamente i tempi di modifica delle directory annidate. Vogliamo orari mod unici per ogni directory.

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 {} \;

E per mettere tutto insieme -

#! /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 {} \; 

Questo script potrebbe fallire se superi ARG_MAX e al momento elencherà solo le modifiche che potrebbero toccare. Puoi rimuovere echo davanti a touch per apportare le modifiche. Si prega di essere consapevoli del fatto che questo script ha solo un test limitato e viene offerto COSÌ COM'È.

    
risposta data 29.05.2018 - 19:50
fonte

Leggi altre domande sui tag