如何将现有 gz (gzip) 文件转换为 rsyncable

如何将现有 gz (gzip) 文件转换为 rsyncable

我正在使用 rsync 来备份包含许多 gz 文件的存储库,其中包括每天的许多新文件。 rsync 备份的进行速度比应有的速度要慢,因为这些 gz 文件不是使用 gzip 的 --rsyncable 选项构建的(这使得 gz 文件更加“rsync 友好”,而不会显着增加其大小或影响其兼容性)。我无法在创建时解决问题,因为这些文件是由 python 脚本(rdiff-backup)生成的,该脚本使用 python 的 gzip 模块,并且不支持与 gzip 的 --rsyncable 等效的功能。

因此,在运行 rsync 之前,我可以识别源数据中的任何新 gz 文件(即自上次运行 rsync 以来的新文件)。现在我想“重新 gzip”这些文件,以便将它们以 rsyncable 格式进行 gzip 压缩。然后我可以从优化的源运行 rsync。

我认为这意味着通过gunzip然后gzip --rsyncable运行每个文件,但我不太确定如何以不会丢失数据或元数据的风险的方式执行此操作。非常感谢建议。

答案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}

相关内容