Manipulando arquivos ou diretórios renomeados em rsync

24

Estou trabalhando em um script rsync para replicação de diretório. Eu tenho que sincronizar apenas arquivos novos ou modificados ou diretórios, mas não estou gostando do fato de que sua cópia renomeou arquivos ou diretórios como um novo arquivo ou diretório, mantendo os arquivos não em sincronia. Também defini um limite de largura de banda de 1 MB, já que isso será executado durante as horas de trabalho comercial. Aqui está o meu script:

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

Como posso manter arquivos e diretórios em sincronia se alguém renomeia algo, com apenas copiar arquivos novos ou modificados? Aqui estão os arquivos em questão

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

Ou haverá uma maneira de mover os arquivos renomeados para outro diretório? /mymounts/VerControl ?

    
por jmituzas 19.03.2013 / 16:04

4 respostas

21

Você pode manipular arquivos movidos e renomeados com rsync se os sistemas de arquivos no diretório de origem e de destino tiverem suporte para links físicos. A ideia é deixar o rsync reconstruir links antes da transferência real. Você pode encontrar uma explicação brilhante aqui .

Acabamos com uma solução simples que cria uma árvore oculta de hard links dentro do diretório source / target, o script básico poderia ser assim:

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

Eu tenho um script de exemplo no GitHub . Mas eu aconselho você a fazer uma grande quantidade de testes antes de usar este método na produção.

    
por 17.05.2014 / 16:47
15

Você pode querer olhar para a opção -y | --fuzzy rsync. Fora isso, o rsync não tem como rastrear renomeações, então você vai acabar transferindo o arquivo renomeado.

Do manpage do 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.
    
por 19.03.2013 / 16:10
0

Até onde eu sei, rsync não pode reconhecer renomeação de arquivos Os novos arquivos terão que ser transferidos novamente. Veja a resposta do artyom .

Para excluir os arquivos perdidos, certifique-se de usar a opção --delete .

Além disso, para espelhamento, recomendo que você use -a ( archive ), que alias algumas boas opções.

Veja o man 1 rsync para detalhes.

    
por 19.03.2013 / 16:13
0

Você não pode.

O rsync tem três modos,

  • Copiar todos os arquivos
  • Copiar arquivos existentes (modificados / não modificados) - você tem muitas opções
  • Copiar arquivos não existentes.

No entanto, estes três modos têm duas subcategorias,

  • Excluir em
  • Incluir em

O Rsync não rastreia quais arquivos são renomeados, não tem estado. Considere, em vez disso, copiar todos arquivos e excluir os que você não deseja. Você não pode ter uma lista de permissões, você pode ter uma lista negra.

rsync [..stuff..] --exclude 'lib/'
    
por 19.03.2013 / 16:14