1

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

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

例如说我有 1.gz、2.gz、3.gz ... 10.gz 现在我需要一个文件,每个说 3 个文件,所以现在 1.gz、2.gz 和 3.gz 将合并为 1_new。 gz等等。

4

2 回答 2

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
于 2012-11-05T16:09:06.093 回答
1

可以将gziped 文件连接在一起,但是当您 gunzip生成文件时,您将获得单个流,请参阅gzip 手册以供参考。

脚本类似于 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编辑的文件,那么这样的连接很好。

于 2012-11-05T16:44:57.203 回答