我有大约8000个gz文件,每个大约60MB。我想将它们合并为几个较大的文件。那么如何在bash脚本中执行此操作而不解压缩?
Shell脚本可以将输入作为新文件大小或要合并的文件数。
例如说我有1.gz,2.gz,3.gz ...... 10.gz 现在每个说3个文件我需要一个文件,所以现在1.gz,2.gz和3.gz将组合成1_new.gz,依此类推。
答案 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
的文件然后这样的连接很好。