A estrutura de diretório profunda e complexa pode ser modificada: os arquivos podem ser movidos (o prefixo alterado) e simultaneamente o conteúdo dos arquivos pode ser alterado parcialmente.
Eu quero diminuir uma quantidade de dados para transmitir pela rede.
rsync
trabalha com blocos de dados de tamanho 4k (se bem me lembro).
Posso usar algum tipo de concatenação ( tar
-like) preservando metainformações sobre a estrutura e os atributos do sistema de arquivos, que coloca o conteúdo do arquivo a partir de deslocamentos de vários bytes de 4k para cada próximo arquivo para habilitar as rsync
vantagens do algoritmo?
O problema que desejo resolver é a omissão de rsync
: ele não consegue detectar se o conteúdo do arquivo foi alterado e o arquivo é movido ao mesmo tempo entre as sincronizações para usar blocos correspondentes de arquivos de destino para reduzir a transferência de dados.
Com base na sua sugestão em um comentário (que realmente deveria estar na sua pergunta), parece ser isso que você deseja
Você precisa de espaço suficiente para armazenar
directory.tar
em ambos os lados.Me perguntaram se essa solução aparentemente trivial pode funcionar na situação em que uma pequena quantidade, como um único byte, é adicionada (ou removida) do início do arquivo tar.
Espero que este exemplo ilustre como
rsync
é bom lidar com essas situações. Funciona melhor se você tiver um login de equivalência (chave de certificado) para o servidor remoto, para que nenhum tempo seja gasto digitando uma senha.Se o algoritmo puder lidar com o único byte inserido no início do fluxo de dados, a transferência deve demorar apenas alguns instantes. Se não puder, você esperaria que o tempo de transferência fosse amplamente semelhante ao primeiro.
Aqui vai mais uma sugestão para você. A
hrsync
ferramenta , que encontrei no GitHub, parece ser muito boa em manter uma memória de arquivos quando você os renomeia ou os move entre os diretórios de uma árvore de origem./usr/local/bin
tenha vantagensExemplo
Encontrei a solução usando
bash
apenas utilitários de linha de comando. É possível otimizar a solução: classificar os arquivos por tamanho em ordem crescente e colocar o máximo possível de arquivos pequenos em cada bloco (problema de mochila aqui =), mas seria engenharia excessiva):pack.bash
:unpack.bash
: