如果我想要附加到现有的.gz文件(如果存在),我该如何安全地gzip和删除文件?

时间:2012-02-13 21:11:49

标签: bash shell find gzip xargs

我的脚本目前看起来像这样:

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文件?

1 个答案:

答案 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包含worlda.log.gz,结果为gzip logs/a.log,其中包含hello

显然不是出于多方面的原因(例如,如果磁盘空间不足,电量耗尽或者每个日志都是1GB或类似的东西),但对于大多数常规应用程序来说,它应该可以胜任。

希望这有帮助。