Usando o rsync para manter uma cópia de um diretório com um nome que muda

Usando o rsync para manter uma cópia de um diretório com um nome que muda

Estou usando o rsync em um sistema Linux para sincronizar um diretório entre o disco local e uma unidade USB conectada. O problema que estou enfrentando é que o sistema de terceiros que cria o backup diariamente no servidor, na verdade, altera o nome de um diretório aninhado profundamente no backup. Este diretório contém a maioria dos dados necessários no backup. Quando o rsync olha para o diretório, ele vê que o nome mudou e o considera um diretório totalmente novo. Portanto, minha cópia rsync na unidade USB possui um novo diretório para cada dia em que é executada.

Eu escrevi scripts que irão realmente alterar o nome do diretório de volta, mas é uma maneira complicada de fazer isso!

Estou procurando uma maneira "elegante" de lidar com isso. É possível criar um link para o diretório que permaneça constante? O rsync pode ser configurado para detectar que o diretório é o mesmo, mesmo que o nome seja alterado? Tenho certeza de que alguém já teve que lidar com isso antes!

Responder1

Uma abordagem seria fazê-lo em duas etapas. Primeiro, sincronize tudo novamente, exceto o diretório em questão, usando padrões de ignorar. Segundo, rsync apenas o diretório usando globbing no bash para chegar ao diretório, assim:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

Usar uma barra final no diretório de origem fará com que o rsync ignore o nome do diretório, porque ele será invocado noconteúdodo diretório em vez do próprio diretório. É claro que esse globbing será mais fácil se o diretório for nomeado com um prefixo ou sufixo constante, como no exemplo acima. Caso contrário, você poderia escrever um script para descobrir o nome real do diretório e fazer algo mais direto como isto:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

No final, seu pseudocódigo seria algo assim:

  1. Encontre $BIGDATADIRNAME
  2. Sincronize tudo novamente como antes, mas ignore $BIGDATADIRNAME
  3. Sincronize novamente oconteúdode $BIGDATADIRNAME

Responder2

Você pode usar as opções de rsync--compare-dest=DIR,--copy-dest=DIR, ou--link-dest=DIR. Eles permitem que você especifique um diretório adicional no receptor para procurar arquivos ausentes.

Usando --link-dest por exemplo, o rsync criaria a nova versão do diretório contendo novas cópias de arquivos que foram alterados, ou então cópias com link físico de arquivos que não foram alterados.

Para usar qualquer uma dessas opções, você precisa saber o nome do diretório na unidade USB da execução anterior do rsync, então você provavelmente desejará agrupar o rsync em um script que descubra primeiro o nome correto do diretório.

Você também pode usar --delete-after para excluir as versões antigas do diretório após criar a nova versão.

Responder3

O Rsync sozinho não pode fazer o que você deseja, porque os únicos metadados que o rsync tem disponíveis são o nome do diretório e os MACtimes.

A única maneira de lidar com isso automaticamente dentro do rsync seria fazer com que o rsync tivesse de alguma forma mais metadados. A replicação DFS da Microsoft no Windows, por exemplo, lida com isso usando o ID exclusivo atribuído aos arquivos em um volume NTFS para detectar quando o nome de um arquivo (ou diretório) muda.

Seu script deselegante é provavelmente a maneira mais fácil de fazer o que você deseja, sem descartar o rsync e procurar outra ferramenta.

Usar um link simbólico não funcionará porque o ponto de junção está vinculado ao nome do diretório de destino (e o nome do diretório de destino estaria mudando, neste caso). Você poderia usar um hardlink (que está vinculado ao inode), mas precisa ter certeza de que o nome do diretório está mudando, em vez de apenas ser excluído e recriado (o que atribuiria a ele um inode diferente).

informação relacionada