我有一些 8000 gz 文件,每个文件大约 60MB。我想将它们合并成几个更大的文件。那么如何在不解压缩的情况下在 bash 脚本中执行此操作?
Shell 脚本可以将输入作为新文件大小或要组合的文件数。
例如说我有 1.gz、2.gz、3.gz ... 10.gz 现在我需要一个文件,每个说 3 个文件,所以现在 1.gz、2.gz 和 3.gz 将合并为 1_new。 gz等等。
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
可以将gzip
ed 文件连接在一起,但是当您 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
编辑的文件,那么这样的连接很好。