Crie um diretório de diferenças recursivas. Copiar referência e diff. Recriar diretório original

1

Eu tenho vários recursos de diretórios / sites, cada um com tamanho total de vários gigabytes. Eles são mais de 90% iguais. Às vezes, apenas alguns arquivos são modificados.
Eu preciso baixar esses arquivos para fins de backup periodicamente. O espaço de armazenamento não é uma preocupação, mas está demorando muito para ser baixado.

Gostaria de:
Use um diretório como referência (d1).
1. Para outro diretório (d2), liste todos os arquivos que são idênticos entre d1 e d2, salve-os no common.txt. Idêntico significa caminho relativo (dentro de d1 e d2), o nome do arquivo e o conteúdo são os mesmos, ignorando o proprietário / grupo e os registros de data e hora. 2. Copie todos os arquivos, que estão em d2, mas não em d1 (inclui arquivos diferentes) em d3.

Então eu baixarei tarballed d1, d3 e common.txt para outra máquina.

Copie d3 para d2.
3. Copie os arquivos listados em common.txt de d1 para d2.

Você poderia sugerir como resolver as etapas (1), (2), (3)?

    
por Mirbek Samiev 12.03.2013 / 02:45

1 resposta

2

Considere a deduplicação. Existe alguma coisa que modifique esses arquivos diretamente em seu servidor (em vez de excluir e fazer upload de algo novo)? Se não houver, você pode criar links simbólicos ou vincular os arquivos idênticos. Isso economizaria espaço de armazenamento em seu servidor e também resolveria automaticamente seu problema de download, ao usar rsync -H , que suporta hardlinks. Contanto que você esteja ciente das armadilhas do hardlink (a modificação no local para um modifica todas elas, já que elas são literalmente o mesmo arquivo), essa é de longe a melhor solução.

Você pode usar fdupes para localizar arquivos duplicados com eficiência. Isso abrange duplicatas de conteúdo, infelizmente, não há nenhum requisito para o nome do arquivo. Você pode usar isso e filtrar a lista de duplicatas para nomes de arquivos; ou você poderia fazer a comparação sozinho. Usando find , stat , cmp .

Exemplo completamente não refinado:

cd d1
find -type f -exec ./compare.sh d1/{} d2/{}

compare.sh:

if [ -f "$1" -a -f "$2" ]
then
    asize='stat -c%s "$1"'
    bsize='stat -c%s "$2"'

    if [ "$asize" == "$bsize" ]
    then
        if cmp "$1" "$2"
        then
            echo IDENTICAL "$1" "$2"
        else
            echo DIFFERENT "$1" "$2"
        fi
    fi
fi

Já que você mencionou tarballs, em vez de simplesmente repetir se um arquivo é idêntico ou diferente, você poderia simplesmente fazer o eco deles em uma lista de arquivos include / exclude para usar com tar --files-from / --exclude-from .

    
por 12.03.2013 / 03:36