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


12

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

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

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


8
唯一重要的方法--rsyncable是两次运行之间是否更改了文件并rsync尝试发送更改。新文件不在乎它们是否可同步,因为rsync无论如何都必须发送所有数据。在rsync运行之间是否更改了文件?
汤姆·亨特

好点子。其实我不确定,我会检查一下。现在让我们假设是的,某些gz文件的内容确实发生了变化。
gogoud

我能想到的最好的事情是运行一个脚本,该脚本检查新文件,将它们解压缩,然后再使用对其进行gzip压缩--rsyncable
汤姆·亨特

我同意,如果文件没有更改,这应该不是问题。特别是为了提高速度,请确保通过使用-a标志保存时间来跳过基于时间的校验和。另外,我的gzip版本没有--rsyncable标志,但确实包含一个名为的程序,该程序znew可能会用于您需要的程序。
user3188445

2
事实证明,正如汤姆所认为的那样,由rdiff-backup创建的gz文件一旦创建就不会更改,因此使用--rsyncable无济于事。我希望有一行代码或简短的脚本可以安全地解压缩gz归档文件并使用来重新打包--rsyncable。但这对我来说只是一个学术问题。
gogoud 2015年

Answers:


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
通过这样做gunzip | gzip,你也失去了未压缩的名称,并存储在GZ文件(和见过的时间gzip -vNl
斯特凡Chazelas

@StéphaneChazelas:您是对的:如果此信息相关(对我而言从未如此),我们将丢失它。也许最好的解决方案是gunzip直接支持这种重新压缩。它可以在内部传递所有元数据。
劳尔·萨利纳斯-蒙塔古多

@StéphaneChazelas你知道无损地做吗?
汤姆·黑尔'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.