Rsync: copia solo su timestamp


42

Attualmente ho due directory A / e B / che sono identiche sotto tutti gli aspetti, ad eccezione dei timestamp. Pertanto, se eseguo il comando:

rsync --dry-run -crvv A/ B/

quindi tutti i file sono contrassegnati "uptodate", mentre il comando:

rsync --dry-run -rvv A/ B/

mostra che tutti i file devono essere copiati da A / a B /.

La mia domanda è questa: dato che so che i file sono identici (rispetto ai contenuti), allora c'è un modo (via rsync o altro) di impostare i timestamp per i file in B / per essere identici ai timestamp dei file in A /, senza copiare tutti i file da A / a B /?

Grazie


Se sai che i file sono identici, allora perché devi fare del tuo meglio per non copiarli per ottenere la data / ora desiderata?
Tim

3
@Tim: forse ci sono molti dati.
Richard,

Risposte:


75

Utilizzando -t(preservare i timestamp) e --size-onlyconfronterai solo i file in base alle dimensioni. Se la dimensione corrisponde, rsync non copierà il file ma poiché -tè specificato, aggiornerà il timestamp sul file di destinazione senza ricopiarlo.

Assicurati di non usare -u(aggiorna) in quanto ciò salterà i file già esistenti e salterà completamente l'aggiornamento del timestamp.

Ho avuto il problema di non utilizzare originariamente rsync per copiare un mucchio di file su una nuova unità, e quindi i timestamp sono stati aggiornati all'ora corrente. Ho usato il comando seguente per sincronizzare tutto correttamente in un discreto periodo di tempo:

rsync -vrt --size-only /src /dest

2
Suggerisco anche di aggiungere --existingper evitare copie accidentali di nuovi file.
guidato il

1
La bandiera --archive(o -a) include -r, -te altro ancora :)
Dor

6

L'uso di --size-only farà sì che rsync salti il ​​confronto dei timestamp del file (e quindi del contenuto del file) se le dimensioni corrispondono. Combinando questo con --times clonerai i timestamp sull'albero di destinazione.


3

Penso che rsync sia lo strumento giusto per farlo, ma se vuoi che uno script faccia questo piuttosto che qualcosa, questo può dare un buon inizio.

È possibile ottenere un elenco di file con timestamp (accesso volte) in questo modo:

find . -printf '"%p" %a\n' -type f > /tmp/times

E ottenere i comandi di aggiornamento dell'ora appropriati da esso:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Non è una sceneggiatura completa ma un buon punto di partenza! :)


Grazie. Penso che probabilmente rimarrò con Rsync per il momento, ma andrò sicuramente sul Web e imparerò i diversi componenti della tua sceneggiatura, poiché potrebbe essere utile in futuro.
artella,

Sembrava essere esattamente la mia soluzione! Voglio preservare i tempi durante l'aggiunta di alcuni metadati alla mia libreria musicale. Tuttavia, apparentemente non riesce a gestire gli spazi nei nomi dei file):
Burcardo,

2

Utilizzare la directory di origine (ad es. /path/to/source) Come riferimento per il comando touch. Solo cdnella tua directory di destinazione e fai

find -type f -exec touch -r /path/to/source/{} {} \;

Non è possibile copiare i timestamp secondari con rsync (ancora).

Funziona anche con directory e pseudo file (basta rimuovere o modificare il -type f)


Questo è stato utile per me poiché avevo bisogno di copiarlo. Ho notato che non copia ctime, il che andava bene nel mio caso.
snapfractalpop

Basta leggere la manpage di 'touch'. Puoi impostare atime e mtime entrambi con questo comando.
Knorke,

Sì, lo so che puoi usare touch -arma ciò non cambia ancora il tempo. Suppongo che raramente sia desiderato.
snapfractalpop

Ah, vedo il problema ora. Grazie. Sì, ctime è difficile da cambiare e non so perché.
Knorke,

1

Bene, potresti certamente scrivere uno script che legge il timestamp da un lato e quindi usa il tocco per impostarlo sullo stesso file dall'altro lato.

Ma ciò probabilmente richiederebbe molto più tempo del semplice lasciare che rsync provi a copiare tutti i file. Verranno effettivamente trasferiti pochissimi dati (blocca gli hash solo se i file sono veramente identici). Ma il contenuto completo di ogni file dovrà essere letto almeno su ogni lato. Quindi sei limitato dalla larghezza di banda del disco o dagli IOPS che potrebbero richiedere del tempo. Ma probabilmente ancora meno tempo che scrivere e testare una sceneggiatura per farlo.


Grazie, non ero a conoscenza di questa funzione di rsync (è discussa anche su Wikipedia).
artella,

0

Per le persone come me che intendono modificare i file e vogliono conservare il timestamp originale (ad es. Aggiorni i meta tag della tua libreria musicale).

Si basa sulla soluzione fornita da Stone. Tuttavia, qui sui tempi di modifica e uno script funzionante per ripristinare i timestamp. PRIMA fai il primo passo, poi inizia a lavorare con i tuoi file.

  1. Conserva i vecchi timestamp . Funziona dalla directory corrente, esclude tutti i file nascosti e lo salva nel file temporaneo in /tmp/files. È sempre possibile modificare i parametri, ma è meglio rimanere con -printf '"%t" "%p"\n'poiché il touchcomando successivo lo utilizza.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Modifica i tuoi file quanto vuoi

  3. ora crea un file che ti aiuti a ripristinare i timestamp:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. E infine applica le vecchie date ai file modificati

    sh job.sh

Avvertenza: funziona per file con spaziatura dei nomi, caratteri speciali, ma ad esempio nessun file con un $segno.


Per evitare (alcuni) problemi con le barre rovesciate nei nomi dei file, utilizzare read -r line. Bene, usa sempreread con -r. Inoltre, puoi evitare l'apertura job.shper ogni file. while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
Metti

2 ° avvertimento: questo script non trasferisce i timestamp nelle directory. (Bene, l'OP non lo ha chiesto.)
Ciao,

0

Il modo migliore per copiare solo il timestamp su Windows:

Per copiare il timestamp dell'ultimo file creato / modificato / accessibile su un altro, è possibile utilizzare:

toccare / c / m / a / r SourceFile DestFile

(Questa versione di Touch fa parte di Win32 Console ToolBox http://www.stevemiller.net/apps/ )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

Il manuale rsync: man rsyncelenca una -te -Ninterruttore, che potrebbe valere la pena giocherellare con.


Non riuscivo a vedere -N. Perché mi consigliate comunque?
Tom Hale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.