Shell脚本:将小的gzip压缩文件加入更大的文件而不解压缩

时间:2012-11-05 13:25:31

标签: bash shell

我有大约8000个gz文件,每个大约60MB。我想将它们合并为几个较大的文件。那么如何在bash脚本中执行此操作而不解压缩

Shell脚本可以将输入作为新文件大小或要合并的文件数。

例如说我有1.gz,2.gz,3.gz ...... 10.gz 现在每个说3个文件我需要一个文件,所以现在1.gz,2.gz和3.gz将组合成1_new.gz,依此类推。

2 个答案:

答案 0 :(得分:1)

gzip只能压缩单个文件。您需要tar将多个文件合并到一个存档中,然后可以(可选)使用gzip进行压缩。如果您只想合并压缩文件,可以使用以下内容:

maxnum=$1
i=1
j=0
for f in *.gz; do
  tar rf archive_$j.tar $f
  if [ $i -eq $maxnum ]; then
    i=1
    j=$((j+1))
  fi
done

这将生成包含压缩源文件的未压缩tar文件。

如果要生成包含未压缩源文件的压缩tar文件,则上述操作无效,因为您无法更新压缩的tar文件。您需要先解压缩源文件,然后从中创建压缩的tar文件:

maxnum=$1
i=1
j=0
flist=
for f in *.gz; do
  gunzip $f
  flist="$flist $(basename $f .gz)"
  if [ $i -eq $maxnum ]; then
    tar czf archive_$j.tar.gz --remove-files $flist
    i=1
    j=$((j+1))
    flist=
  fi
done

答案 1 :(得分:1)

可以将gzip个ed文件合并在一起,但是当您gunzip生成的文件时,您将获得单个流,请参阅gzip manual以供参考。

脚本与Ansgar Wiechers的tar类似:

#!/bin/bash

maxnum=$1
i=1
j=0
for f in *.gz; do
   cat $f >> archive_$j.gz
   i=$((i+1))
   if [ $i -eq $maxnum ]; then
      i=1
      j=$((j+1))
   fi
done

请注意,上述代码未经测试。

如果你想正确存档 tar是一个更好的解决方案,但如果你想要做的就是整合一些gzip的文件然后这样的连接很好。