如何确保原始文件和gzip压缩版本不一样

时间:2011-06-11 09:20:50

标签: bash gzip

我的测试设备会生成大型文本文件,这些文件在添加数据后会在几天内逐渐增大。

但是文本文件会传输到PC进行备份每日,即使在成长之前,也会使用gzip进行压缩。

这意味着我经常同时拥有file.txt和压缩格式file.txt.gz,其中未压缩文件可能比压缩版本更新。

我决定使用以下bash脚本gzandrm保留哪些内容:

#!/usr/bin/bash

# Given an uncompressed file, look in the same directory for 
# a gzipped version of the file and delete the uncompressed 
# file if zdiff reveals they're identical. Otherwise, the 
# file can be compressed.

# eg:  find . -name '*.txt' -exec gzandrm {} \;

if [[ -e $1 && -e $1.gz ]] 
then

    # simple check: use zdiff and count the characters
    DIFFS=$(zdiff "$1" "$1.gz" | wc -c)

    if [[ $DIFFS -eq 0 ]] 
    then

        # difference is '0', delete the uncompressed file
        echo "'$1' already gzipped, so removed"
        rm "$1"

    else

        # difference is non-zero, check manually
        echo "'$1' and '$1.gz' are different"

    fi

else
    # go ahead and compress the file
    echo "'$1' not yet gzipped, doing it now"
    gzip "$1"
fi

并且运行良好,但比较文件的修改日期更有意义,因为gzip在压缩时不会更改修改日期,因此具有相同日期的两个文件实际上是相同的文件,即使其中一个被压缩。

如何修改我的脚本以通过 date 而不是 size 来比较文件?

2 个答案:

答案 0 :(得分:1)

您可以使用stat使用%Y%Z格式字符串轻松比较文件的日期标记,以获取上次修改的时间或从纪元更改的秒数

if [ $(stat -c %Z $1) -eq ($stat -c %Z $1.gz) ]; then
    echo "Last changed time of $1 is the same as $1.gz"
fi

答案 1 :(得分:1)

目标并不完全清楚,但它似乎是简单的效率,所以我认为你应该做两个改变:1)按照你的建议检查修改时间,如果未压缩文件,不要打扰比较内容并不比压缩文件更新,2)使用zcmp而不是zdiff

首先考虑#2,你的脚本会这样做:

DIFFS=$(zdiff "$1" "$1.gz" | wc -c)
if [[ $DIFFS -eq 0 ]]

将执行潜在大文件的完全差异,计算diff输出中的字符,并检查计数。但你真正想知道的是内容是否不同。 cmp对此更好,因为它将逐字节扫描并在遇到差异时停止。它没有花时间格式化一个很好的文本比较(你将大部分忽略);它的退出状态告诉你结果。 zcmp效率不如原始cmp,因为它首先需要进行解压缩,但zdiff会遇到同样的问题。

所以你可以切换到zcmp(并删除使用子shell,消除wc,不调用[[,并避免将可能较大的文本差异数据放入变量中通过将以上两行更改为:

if zcmp -s "$1"    # if $1 and $1.gz are the same

要更进一步并首先检查修改时间,您可以使用-nt(更新)选项test命令(也称为方括号),重写上面的行,因此:

if [ ! "$1" -nt "$1.gz" ] || zcmp -s "$1"

表示如果未压缩的版本不比压缩版本新,或者如果它们具有相同的内容,则$ 1已经被gzip压缩,您可以删除它。请注意,如果未压缩的文件不是新版本,则zcmp将根本不运行,从而节省了一些周期。

你的脚本的其余部分应该按原样运行。

一个警告:修改时间很容易改变。只需将压缩文件从一台机器移动到另一台机器就可以改变其模态时间,因此您必须考虑自己的情况,以了解模态检查是有效的优化还是比它的价值更麻烦。