我的脚本目前看起来像这样:
find Logs/ -type f -name \*.log -exec gzip -q -9 {} \;
现在,如果myLog.log.gz已经存在,则会失败。相反,我想附加到myLog.log.gz。 gzip手册页说明您可以使用gzip -c myLog.log >> myLog.log.gz
之类的内容执行此操作。但是当它完成gzipping时,这不会删除myLog.log。
如何安全地gzip和删除文件,必要时附加到现有的.gz文件?
答案 0 :(得分:1)
首先,根据您想要做的事情(例如仅用于存档目的),仅仅tar
两个文件或其他内容可能更合适。但是,下面是您解释的要求。
我真的希望:)有一种更简洁的方法可以做到这一点,但缺少这一个will do the job:
find logs -type f -name \*.log -exec sh -c '
if [ -f "{}.gz" ]; then
tmpf=`mktemp tmpXXX`
mv "{}" $tmpf
gunzip "{}"
cat $tmpf >> "{}"
gzip "{}"
rm $tmpf
else
gzip {}
fi
' \;
这是一个小的测试脚本 - 将上面的gzip-combine.sh
放在test-gzip-combine.sh
的下面,并在一些临时文件夹中运行(如您所见,它会删除该文件夹下的logs
,所以不要在实际有日志的地方运行它:))):
# Make sample logs
rm -rf logs
mkdir logs
echo "hello" > logs/a.log
gzip logs/a.log
echo "world" > logs/a.log
echo "miss" > logs/b.log
echo "think" > logs/c.log
# Run
./gzip-combine.sh
# Test
for i in logs/*; do
echo ---- $i
gzip -l $i
gunzip -c $i
done
输出将是这样的:
$ ./test-gzip-combine.sh
---- logs/a.log.gz
compressed uncompressed ratio uncompressed_name
38 12 50.0% logs/a.log
hello
world
---- logs/b.log.gz
compressed uncompressed ratio uncompressed_name
31 5 120.0% logs/b.log
miss
---- logs/c.log.gz
compressed uncompressed ratio uncompressed_name
32 6 100.0% logs/c.log
think
因此,您可以看到a.log
包含world
和a.log.gz
,结果为gzip logs/a.log
,其中包含hello
。
显然不是出于多方面的原因(例如,如果磁盘空间不足,电量耗尽或者每个日志都是1GB或类似的东西),但对于大多数常规应用程序来说,它应该可以胜任。
希望这有帮助。