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

5

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 realmente altera o nome de um diretório aninhado profundamente no backup. Este diretório possui a maioria dos dados necessários no backup. Quando rsync olha para o diretório, ele vê que o nome foi alterado e considera um diretório totalmente novo. Portanto, minha cópia do rsync na unidade USB tem um novo diretório para cada dia que é executado.

Eu escrevi scripts que realmente mudam o nome do diretório, 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 permanece constante? O rsync pode ser configurado para detectar que o diretório é o mesmo, mesmo que o nome seja alterado? Tenho certeza que alguém teve que lidar com isso antes!

    
por TrevJen 08.07.2009 / 18:02

3 respostas

5

Uma abordagem seria fazer isso em duas etapas. Primeiro, rsync tudo, exceto o diretório em questão, usando padrões de ignorar. 2º, 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 no diretório de origem fará com que o rsync ignore o nome do diretório, porque ele será invocado no conteúdo do diretório em vez do próprio diretório. Naturalmente, esse globbing será mais fácil se o diretório for nomeado com um prefixo ou sufixo constante, como no exemplo acima. Se não for, você pode escrever um script para descobrir o nome real do diretório e fazer algo mais direto assim:

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

No final, seu pseudo-código seria algo assim:

  1. Encontre $ BIGDATADIRNAME
  2. Rincronize tudo como era antes, mas ignore $ BIGDATADIRNAME
  3. Rsync o conteúdo de $ BIGDATADIRNAME
por 08.07.2009 / 18:21
2

Você pode usar as opções de rsync - compare-dest = DIR , - copiar-dest = DIR , ou - link- dest = DIR . Eles permitem que você especifique um diretório adicional na extremidade de recepção para procurar arquivos ausentes.

Usando o --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 de arquivos com hard-link que não foram feitas.

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

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

    
por 08.07.2009 / 18:43
1

O rsync sozinho não pode fazer o que você quer, porque o único rsync de metadados disponível é o nome do diretório e o MACtimes.

A única maneira de lidar com isso automaticamente dentro do rsync seria que o rsync de alguma forma tivesse 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 capturar quando um nome de arquivo (ou diretório) é alterado.

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

O uso de 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á ligado ao inode), mas você precisa ter certeza de que o nome do diretório está mudando, em vez de apenas ser deletado e recriado (o que o designaria um inode diferente).

    
por 08.07.2009 / 18:15