Gestione di file o directory rinominati in rsync


26

Sto lavorando a uno rsyncscript per la replica di directory. Ho sincronizzato solo i file o le directory nuovi e modificati, ma non mi piace il fatto che copi i file o le directory rinominati come nuovi file o directory, mantenendo i file non sincronizzati. Ho anche impostato un limite di larghezza di banda di 1 MB poiché questo verrà eseguito durante l'orario di lavoro. Ecco la mia sceneggiatura:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

Come posso sincronizzare file e directory se qualcuno rinomina qualcosa, continuando a copiare solo file nuovi o modificati? Ecco i file in questione

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

O ci sarebbe un modo per spostare i file rinominati in un'altra directory dire /mymounts/VerControl:?

Risposte:


23

È possibile gestire i file spostati e rinominati con rsyncse i filesystem nella directory di origine e destinazione hanno il supporto per i collegamenti reali. L'idea è di consentire a rsync di ricostruire i collegamenti reali prima del trasferimento reale. Puoi trovare una brillante spiegazione qui .

Abbiamo finito con una semplice soluzione che creava un albero nascosto di hard link all'interno della directory source / target, lo script di base potrebbe essere così:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

Ho uno script di esempio su GitHub . Ma ti consiglio di fare molti test prima di usare questo metodo in produzione.


Anche la "brillante spiegazione" a cui fai riferimento si riferisce anche a questo fantastico rsyncarticolo di base , FWIW. everythinglinux.org/rsync
JakeGould

19

Potresti voler guardare l' -y | --fuzzyopzione rsync. A parte questo, rsync non ha modo di rintracciare i nomi, quindi finirai per trasferire il file rinominato.

Dalla manpage rsync:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

7
Si noti che, se si utilizza --fuzzy, si dovrebbe considerare di accoppiarlo con --delete-delay, come "rsync di default fa un --delete-before, rimuovendo così il file di base prima che possa essere copiato / spostato" . Fonte: Sonia Hamilton
Ronan Jouchet,

1

Non puoi.

Rsync ha tre modalità,

  • Copia tutti i file
  • Copia i file esistenti (modificati / non modificati) - su questo hai molte opzioni
  • Copia file inesistenti.

Tuttavia, queste tre modalità hanno due sottocategorie,

  • Escludere
  • Includi su

Rsync non tiene traccia dei file rinominati, non ha stato. Considera invece di copiare tutti i file ed escludendo quelli che non desideri. Non puoi avere una lista bianca mobile, puoi avere una lista nera.

rsync [..stuff..] --exclude 'lib/'

grazie grazie per l'input dovrà convivere con i file rinominati allora.
jmituzas,

Puoi farlo eliminare i file che non esistono, va benissimo. Ma come funzione di copia, se si rinomina in origine, verrà copiato il file rinominato.
Evan Carroll

Posso mantenere le versioni con -b e impostare suffisso = date +%Y%m%d%k%M%Scomunque posso ottenere suffisso = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas,

0

Per quanto ne so, rsyncnon riesco a riconoscere la ridenominazione dei file. I nuovi file dovranno essere trasferiti di nuovo. Vedi la risposta di artyom .

Per eliminare i file andati, assicurati di usare l' --deleteopzione.

Inoltre, per il mirroring, ti consiglio di usare -a( archivio ), che alias alcune belle opzioni.

Dai un'occhiata ai man 1 rsyncdettagli.


grazie che funzionerà --delete / mymounts / test1 / / mymounts / test2 /
jmituzas
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.