rsync: compare diretórios com links simbólicos

6

Existem várias perguntas semelhantes aqui, mas não acho que nenhuma delas responda isso.

Eu tenho um diretório local ( www ) que precisa ser espelhado exatamente em um servidor remoto, e preciso confirmar se são cópias exatas.

www contém links simbólicos para outros arquivos dentro de www (os links são para arquivos e diretórios regulares). Este comando irá comparar as duas versões de www , excluindo os diretórios svn locais como bônus, e imprimir apenas os arquivos diferentes:

[local]$ rsync -rvnc --exclude=.svn/ --delete www/ remote:/var/www/

Mas ele não segue links simbólicos e apenas relata que eles não são arquivos regulares. Então, preciso desreferenciar os links simbólicos e comparar seus alvos. Nem rsync -rvncL nem rsync -rvncK faz isso - -L imprime muitos arquivos que não são diferentes (que eu vejo, pelo menos) e -K não está fazendo nada. Alguma ideia?

    
por EML 19.03.2017 / 16:38

1 resposta

0

Usar comandos normais com links simbólicos é muito complicado. O comando find manipula-os muito bem. Portanto, a chave é usar find e eu sugiro usar uma função de hash criptográfica ou CRC rápida, dependendo das suas necessidades.

Então, algo assim deve funcionar (você pode fazer suplementos quando necessário)

find -L www -type f -exec cksum {} \; | cut -d ' ' -f1-2 | md5sum

Se você quiser suporte criptográfico para suas somas de verificação,

find -L www -type f -exec sha256sum {} \; | cut -d ' ' -f1 | sha256sum

O identificador 'type' é necessário porque o sha256 só funciona em arquivos e erros para diretórios, e o corte é usado apenas para passar a soma de verificação / hash para a função final e evitar falsos positivos quando na realidade apenas os nomes de caminho são diferente.

Nota: Isso falhará caso o symlink não seja relativo e se os dois sistemas não tiverem o mesmo caminho exato que pode acontecer se um symlink apontar para fora do diretório em que você está executando find on.

    
por 03.05.2017 / 05:21

Tags