我的测试设备会生成大型文本文件,这些文件在添加数据后会在几天内逐渐增大。
但是文本文件会传输到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 来比较文件?
答案 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
将根本不运行,从而节省了一些周期。
你的脚本的其余部分应该按原样运行。
一个警告:修改时间很容易改变。只需将压缩文件从一台机器移动到另一台机器就可以改变其模态时间,因此您必须考虑自己的情况,以了解模态检查是有效的优化还是比它的价值更麻烦。