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.


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}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.