Apagar arquivos duplicados com rsync

5

Aqui está a coisa,

Eu tenho uma pasta no meu servidor com 50 GB de tamanho e 'contendo mais de 60000 arquivos. Eu usei rsync para transferi-lo para um servidor espelho e quase metade do arquivo foi transferido.Agora eu quero excluir o arquivo transferido no servidor principal.

Isso pode ser feito com o rsync? Eu li a ajuda e encontrei a opção --delete, mas esses arquivos são tão importantes, então eu quero ter uma opinião de especialista, obrigado.

    
por codedme 16.07.2013 / 22:25

2 respostas

4

O rsync (verificado com a versão 3.0.9) possui uma opção chamada --remove-source-files , que faz o que diz. Se você quiser apenas excluir os arquivos transferidos e não transferir arquivos adicionais que ainda não tenham sido transferidos, será necessário usar adicionalmente a opção '--existindo' '.

Infelizmente, parece que o rsync não mostra quais arquivos ele está excluindo, mesmo se as opções --verbose --itemize-changes --stats forem usadas.

Exemplo

# create source and target dirs
mkdir /tmp/source
mkdir /tmp/target
# create a test file in source
touch /tmp/source/test
# rsync source and target
rsync --archive --itemize-changes --verbose --stats /tmp/source/ /tmp/target
# verify that test has been copied to target
[ -f /tmp/target/test ] && echo "Found" || echo "Not found"
# create another file in source
touch /tmp/source/test2
# delete files on source which are already existing on target
rsync --archive --itemize-changes --verbose --stats --remove-source-files --existing /tmp/source/ /tmp/target
# verify that test has been deleted on source
[ -f /tmp/source/test ] && echo "Found" || echo "Not found"
# verify that test2 still exists on source and was not transferred to target
[ -f /tmp/source/test2 ] && echo "Found" || echo "Not found"
[ -f /tmp/target/test2 ] && echo "Found" || echo "Not found"
    
por 20.07.2013 / 11:00
1

Como escrito antes, o rsync não será excluído da fonte, apenas no destino.

No seu caso, eu geraria hashes MD5 dos arquivos no servidor espelhado, depois verificaria no servidor principal se os hashes estavam corretos e removesse esses arquivos.

Ou seja:

mirror$ find . -type f -print0 | xargs -0 md5sum > mirror.md5

.. transfira mirror.md5 para o servidor principal ...

primary$ md5sum -c mirror.md5

Verifique se há algum arquivo FAILED e remova os arquivos que foram transferidos com êxito. Você pode automatizá-lo assim:

md5sum -c mirror.md5 | grep 'OK$' | sed -e 's/: OK$//' | while read FILE; do rm "$FILE"; done

Isto filtrará todos os arquivos com um bom hash, cortará a parte 'OK' do md5sum e removerá os arquivos um por um.

Escusado será dizer que depois disso você não quer usar a opção --delete do rsync para transferir a segunda metade dos seus arquivos ...

    
por 16.07.2013 / 23:59