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.