使用 tar、 gz、 zip 或 bzip2拆分文件

我需要压缩一个大约17-20 GB 的文件。我需要把它分成几个文件,每个文件大约1GB。

我通过 Google 搜索了一个解决方案,并找到了使用 splitcat命令的方法。但它们根本不适用于大型文件。而且,它们不能在 Windows 中工作; 我需要在 Windows 机器上解压缩它。

234713 次浏览

测试代码,最初创建一个归档文件,然后分割它:

 gzip -c file.orig > file.gz
CHUNKSIZE=1073741824
PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]


# the remainder is taken care of, for example for
# 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
# all of file
for n in `seq 0 $PARTCNT`
do
dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
done

这个变体省略了创建单个归档文件,直接创建部分:

gzip -c file.orig |
( CHUNKSIZE=1073741824;
i=0;
while true; do
i=$[i+1];
head -c "$CHUNKSIZE" > "part.$i";
[ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
done; )

在这个变体中,如果存档的文件大小可以被 $CHUNKSIZE整除,那么最后一个部分文件的文件大小将为0字节。

如果您正在从 Linux 分离出来,您仍然可以在 Windows 中重新组装。

copy /b file1 + file2 + file3 + file4 filetogether

使用焦油到 分成多个档案馆

有很多程序可以在 windows 上使用 tar 文件,包括 cygwin。

您可以在 -b选项中使用 split命令:

split -b 1024m file.tar.gz

它可以用@约书亚的答案在 Windows 机器上重新组装。

copy /b file1 + file2 + file3 + file4 filetogether

编辑 : 正如@Charlie 在下面的注释中指出的,您可能需要显式地设置前缀,因为它将使用 x,否则,这可能会造成混淆。

split -b 1024m "file.tar.gz" "file.tar.gz.part-"


// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

编辑 : 编辑文章,因为问题是封闭的,最有效的解决方案非常接近这个答案的内容:

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

这个解决方案避免了在(反)压缩时使用中间大文件的需要。使用 tar-C 选项为生成的文件使用不同的目录。Btw 如果归档文件只包含一个文件,那么可以避免 tar,只使用 gzip:

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

对于 Windows,您可以下载相同命令的移植版本或使用 cygwin。