Manipulando arquivos ou diretórios renomeados no rsync


26

Estou trabalhando em um rsyncscript para replicação de diretório. Eu sincronizo apenas arquivos ou diretórios novos e modificados, mas não estou gostando do fato de que ele está copiando arquivos ou diretórios renomeados como um novo arquivo ou diretório, mantendo os arquivos não sincronizados. Também defini um limite de largura de banda de 1 MB, pois ele será executado durante o horário comercial. Aqui está o meu script:

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

Como posso manter os arquivos e diretórios sincronizados se alguém renomeia algo, mas ainda copia apenas 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 haveria uma maneira de mover os arquivos renomeados para outro diretório, digitando /mymounts/VerControl:?

Respostas:


23

Você pode manipular arquivos movidos e renomeados rsyncse os sistemas de arquivos no diretório de origem e destino tiverem suporte para links físicos. A idéia é permitir que o rsync reconstrua os links físicos 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 links físicos dentro do diretório de origem / destino, o script básico pode 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 recomendo que você faça uma grande quantidade de testes antes de usar esse método na produção.


Além disso, a "explicação brilhante" à qual você vincula também se refere a este excelente rsyncartigo básico , o FWIW. Tudo sobre o
linux.org/rsync

19

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

Na página de manual 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.

7
Observe que, se estiver usando --fuzzy, considere acoplá-lo com --delete-delay, como "o rsync por padrão faz a --delete-before, removendo o arquivo base antes que ele possa ser copiado / movido" . Fonte: Sonia Hamilton
Ronan Jouchet

1

Você não pode.

Rsync tem três modos,

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

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

  • Excluir em
  • Incluir em

O Rsync não controla quais arquivos são renomeados, não possui estado. Em vez disso, considere copiar todos os arquivos e excluir os que não deseja. Você não pode ter uma lista de permissões que pode ser alterada, pode ter uma lista negra.

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

pegado obrigado pela entrada terá que viver com os arquivos renomeados então.
jmituzas

Você pode excluir os arquivos que não existem, tudo bem. Mas como uma função de cópia, se você renomear na fonte, ele copiará o arquivo renomeado.
Evan Carroll

Posso manter as versões com -b e definir sufixo = date +%Y%m%d%k%M%Senfim, posso obter o sufixo = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas

0

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

Para excluir os arquivos perdidos, use a --deleteopção

Além disso, para o espelhamento, eu recomendaria que você usasse -a( archive ), que usa algumas opções interessantes.

Dê uma olhada no man 1 rsyncpara detalhes.


graças que irá trabalhar --delete / mymounts / test1 / / mymounts / test2 /
jmituzas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.