Come convertire i file gz (gzip) esistenti in rsyncable


12

Sto usando rsync per eseguire il backup di un repository che contiene molti file gz, inclusi molti nuovi ogni giorno. Il backup di rsync procede più lentamente di quanto dovrebbe perché questi file gz non sono creati con l'opzione --rsyncable di gzip (che rende i file gz molto più "rsync-friendly" senza aumentarne significativamente le dimensioni o comprometterne la compatibilità). E non posso risolvere il problema al momento della creazione perché i file sono generati da uno script Python (rdiff-backup) che utilizza il modulo gzip di Python e questo non supporta un equivalente di --rsyncable di gzip.

Quindi, prima di eseguire rsync, posso identificare tutti i nuovi file gz nei dati di origine (ovvero nuovi dall'ultima volta che è stato eseguito rsync). Ora voglio "re-gzip" questi file in modo che siano compressi con gzip in formato rsyncable. Quindi posso eseguire rsync dalla fonte ottimizzata.

Penso che questo significhi eseguire ogni file tramite gunzip e poi gzip --rsyncable ma non sono troppo sicuro di come farlo in un modo che non rischierà di perdere dati o metadati. Suggerimenti ricevuti con gratitudine.


8
L'unico modo --rsyncabledovrebbe importare è se i file vengono cambiati tra le esecuzioni e rsynctenta di inviare le modifiche. Ai nuovi file non importa se sono sincronizzabili o meno, perché rsyncdevono comunque inviare tutti i dati. I file vengono cambiati tra le esecuzioni rsync?
Tom Hunt,

Buon punto. In realtà non sono sicuro, lo verificherò. Supponiamo per ora che sì, il contenuto di alcuni file gz venga modificato.
gogoud,

La cosa migliore che mi viene in mente è di eseguire uno script che controlla la presenza di nuovi file, li decomprime e poi li scompone nuovamente --rsyncable.
Tom Hunt,

Sono d'accordo che se i file non cambiano, questo non dovrebbe essere un problema. In particolare, per la velocità assicurati di saltare il checksum in base al tempo preservando i tempi usando la -abandiera. Inoltre, la mia versione di gzip non ha un --rsyncableflag, ma viene fornito con un programma chiamato znewche potrebbe probabilmente essere utilizzato per quello che ti serve.
user3188445

2
Si scopre che, come pensava Tom, i file gz creati da rdiff-backup non cambiano una volta creati e quindi l'utilizzo --rsyncablenon sarebbe d'aiuto. Speravo in una riga di codice o in uno script breve che potesse decomprimere in modo sicuro un archivio gz e reimballarlo usando --rsyncable. Ma è solo una domanda accademica per me adesso.
gogoud,

Risposte:


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
In questo modo gunzip | gzipstai perdendo il nome e l'ora non compressi memorizzati nel file gz (e visti con gzip -vNl)
Stéphane Chazelas,

@ Stéphane Chazelas: hai ragione: se questa informazione è rilevante (non è mai stata rilevante per me), la stiamo perdendo. Forse la migliore soluzione sarebbe che gunzip supporti direttamente questa ricompressione. Potrebbe passare internamente tutti i metadati.
Raúl Salinas-Monteagudo,

@ StéphaneChazelas Conosci qualcuno che lo faccia senza perdita?
Tom Hale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.