Como converter arquivos gz (gzip) existentes 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 rsync continua mais devagar do que deveria porque esses arquivos gz não são construídos com a opção --rsyncable do gzip (o que torna os arquivos gz muito mais 'amigáveis ao rsync' sem aumentar significativamente seu tamanho ou afetar sua compatibilidade). E eu não posso consertar o problema na hora 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 qualquer novo arquivo gz nos dados de origem (isto é, novo desde a última execução do rsync). Agora eu quero "re-gzip" esses arquivos para que eles sejam gzipados no formato rsyncable. Então eu posso executar o rsync da fonte otimizada.

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

    
por gogoud 20.11.2015 / 19:36

1 resposta

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}
    
por 27.09.2016 / 13:47

Tags