Manejo de archivos o directorios renombrados en rsync

26

Estoy trabajando en un rsyncscript para la replicación de directorios. Tengo que sincronizar solo archivos o directorios nuevos y modificados, pero no me gusta el hecho de que está copiando archivos o directorios renombrados como un nuevo archivo o directorio, manteniendo los archivos no sincronizados. También he establecido un límite de ancho de banda de 1 MB ya que esto se ejecutará durante el horario laboral. Aquí está mi guión:

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

¿Cómo puedo mantener sincronizados los archivos y directorios si alguien cambia el nombre de algo, y solo copian archivos nuevos o modificados? Aquí están los archivos en cuestión

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 habría una manera de incluso mover los archivos renombrados a otro directorio /mymounts/VerControl?

jmituzas
fuente

Respuestas:

23

Puede manejar archivos movidos y renombrados rsyncsi los sistemas de archivos en el directorio de origen y destino tienen soporte para enlaces duros. La idea es dejar que rsync reconstruya enlaces duros antes de una transferencia real. Puedes encontrar una explicación brillante aquí .

Terminamos con una solución simple que crea un árbol oculto de enlaces duros dentro del directorio fuente / destino, el script básico podría ser así:

# 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"

Tengo un script de ejemplo en GitHub . Pero le aconsejo que haga una gran cantidad de pruebas antes de usar este método en la producción.

dparoli
fuente
También la "explicación brillante" a la que se vincula también se refiere a este gran rsyncartículo básico , FWIW. everythinglinux.org/rsync
JakeGould
19

Es posible que desee ver la -y | --fuzzyopción rsync. Aparte de eso, rsync no tiene forma de rastrear los renombrados, por lo que terminará transfiriendo el archivo renombrado.

Desde la página de manual de 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.
artyom
fuente
77
Tenga en cuenta que, si lo usa --fuzzy, debería considerar acoplarlo --delete-delay, ya que "rsync por defecto lo hace --delete-before, eliminando así el archivo base antes de que se pueda copiar / mover" . Fuente: Sonia Hamilton
Ronan Jouchet
1

No puedes

Rsync tiene tres modos,

  • Copia todos los archivos
  • Copie archivos existentes (modificados / no modificados): en este tiene muchas opciones
  • Copiar archivos no existentes.

Sin embargo, estos tres modos tienen dos subcategorías,

  • Excluir en
  • Incluir en

Rsync no rastrea qué archivos se renombran, no tiene estado. Considere en su lugar copiar todos los archivos y excluir los que no desea. No puede tener una lista blanca cambiante, puede tener una lista negra.

rsync [..stuff..] --exclude 'lib/'
Evan Carroll
fuente
gotcha gracias por la entrada tendrá que vivir con los archivos renombrados entonces.
jmituzas
Puede hacer que elimine los archivos que no existen, eso está perfectamente bien. Pero en función de la copia, si cambia el nombre en la fuente, copiará el archivo renombrado.
Evan Carroll
Puedo mantener las versiones con -b y establecer sufijo = de date +%Y%m%d%k%M%Stodos modos puedo obtener sufijo = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas
0

Que yo sepa, rsyncno puedo reconocer el cambio de nombre de los archivos. Los archivos nuevos deberán transferirse nuevamente. Ver la respuesta de artyom .

Para eliminar los archivos desaparecidos, asegúrese de usar la --deleteopción.

Además, para duplicar, le recomendaría que use -a( archivo ), que alias algunas buenas opciones.

Echa un vistazo a los man 1 rsyncdetalles.

Lukas
fuente
gracias que funcionará --delete / mymounts / test1 / / mymounts / test2 /
jmituzas