Como converter arquivos existentes gz (gzip) para rsyncable

12

Estou usando o rsync para fazer backup de um repositório que contém muitos arquivos gz, incluindo muitos novos a cada dia. O backup do rsync prossegue mais lentamente do que deveria, porque esses arquivos gz não foram criados com a opção --rsyncable do gzip (que torna os arquivos gz muito mais "compatíveis com o rsync", sem aumentar significativamente o tamanho ou afetar a compatibilidade). E não consigo resolver o problema no momento da criação, porque os arquivos são gerados por um script python (rdiff-backup) que usa o módulo gzip do python e isso não suporta um equivalente ao --rsyncable do gzip.

Portanto, antes de executar o rsync, posso identificar quaisquer novos arquivos gz nos dados de origem (ou seja, novos desde a última vez que o rsync foi executado). Agora eu quero 're-compactar' esses arquivos para que sejam compactados no formato rsyncable. Então eu posso executar o rsync da fonte otimizada.

Eu acho que isso significa executar cada arquivo através do gunzip e depois do gzip --rsyncable, mas não sei muito bem como fazer isso de uma maneira que não corra o risco de perder dados ou metadados. Sugestões recebidas com gratidão.

gogoud
fonte
8
A única maneira --rsyncableque importa é se os arquivos são alterados entre as execuções e rsynctenta enviar as alterações. Os novos arquivos não se importam se são sincronizáveis ​​ou não, porque precisam rsyncenviar todos os dados de qualquer maneira. Os arquivos estão sendo alterados entre as execuções do rsync?
Tom Hunt
Bom ponto. Na verdade, não tenho certeza, vou verificar isso. Vamos supor, por enquanto, que sim, o conteúdo de alguns arquivos gz seja alterado.
Ggoud #
A melhor coisa que consigo pensar é executar um script que verifique se há novos arquivos, descompacte-os e depois descompacte-os novamente --rsyncable.
Tom Hunt
Concordo que, se os arquivos não mudarem, isso não deve ser um problema. Em particular, para velocidade, pule a soma de verificação com base no tempo, preservando os tempos usando o -asinalizador. Além disso, minha versão do gzip não possui um --rsyncablesinalizador, mas ele vem com um programa chamado znewque provavelmente poderia ser usado para o que você precisa.
user3188445
2
Acontece que, como Tom pensava, os arquivos gz criados pelo rdiff-backup não mudam uma vez criados e, portanto, o uso --rsyncablenão ajudaria. Eu esperava uma linha de código ou script curto que descompactasse com segurança um arquivo gz e o reembalasse usando --rsyncable. Mas é apenas uma questão acadêmica para mim agora.
Gogoud

Respostas:

1
#! /bin/bash

set -euo pipefail

##  TOKEN's creation time marks the time since last recompression
TOKEN=.lastRecompression   

if [ -f ${TOKEN} ]
then
    find -name '*.gz' -cnewer "${TOKEN}"
else
    # Process all compressed files if there is no token.
    find -name '*.gz'
fi | while read f
do
    # Do it in two steps
    gunzip < "$f" | gzip --rsyncable > "$f.tmp"

    # Preserve attributes
    cp "$f" "$f.tmp" --attributes-only

    # and rename atomically.
    # set -e ensures that a problem in the previous step 
    # will stop the full script. 
    mv -v "$f.tmp" "$f"
done

# Update the token
touch ${TOKEN}
Raúl Salinas-Monteagudo
fonte
1
Ao fazer gunzip | gzip, você está perdendo o nome descompactado e tempo como armazenado no arquivo gz (e visto com gzip -vNl)
Stéphane Chazelas
@ Stéphane Chazelas: Você está certo: se essa informação é relevante (nunca foi relevante para mim), estamos perdendo. Talvez a melhor solução seja o gunzip suportar diretamente essa re-compactação. Pode passar todos os metadados internamente.
Raúl Salinas-Monteagudo
@ StéphaneChazelas Você conhece alguém para fazer isso sem perdas?
Tom Hale