使用tar,gz,zip或bzip2分割文件


144

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

我通过Google搜索了一个解决方案,并找到了使用splitcat命令的方法。但是它们根本不适用于大型文件。另外,它们将无法在Windows中使用;我需要在Windows计算机上将其解压缩。


3
我感到您很痛苦,但这似乎与编程无关。
杰森S 2009年

1
许多压缩程序(例如7-Zip)都可以将压缩文件拆分为指定大小的卷,以便于分发。
Martin Liversage,2009年

有人告诉我,这属于superuser.com,但是私有Beta直到明天才开始。
JesperE

请问为什么您需要压缩该文件?
Jan Jungnickel

如果这里发布的两个可行解决方案之一没有成功,那么他将需要一个编程解决方案。
约书亚

Answers:


253

您可以将split命令与以下-b选项一起使用:

split -b 1024m file.tar.gz

可以使用@ Joshua的答案在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选项可为生成的文件使用其他目录。顺便说一句,如果存档仅由单个文件组成,则可以避免使用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。


7
如果您没有在要分割的文件名后面添加最后一个参数作为前缀,则会在名为xaa,xab,xac,xad ...的文件中输出输出。–
Charlie

@查理,谢谢,我更新了答案。
matpie

2
实际使用时-b 1024MiB出现错误,表明字节数无效。使用--bytes=1024m作品。
布莱恩(Brian)

而且您不必使用cat重组文件。您可以copy /b file1 + file2 + etc..在Windows上使用,然后复制回Linux,tar可以读取重新组装的tarball。我刚试过
布莱恩

1
Split具有选项--numeric-suffixes:使用数字后缀而不是字母。
Jan-Philip Gehrcke博士,2015年

27

如果从Linux拆分,则仍可以在Windows中重新组装。

copy /b file1 + file2 + file3 + file4 filetogether

你也可以使用copy /b file* filetogether- support.microsoft.com/kb/71161
EUG

5
仅在NTFS上并且文件已经按NTFS排序顺序才能正常工作。尝试使用FAT或FAT32 =臂杆。
约书亚

+1确保文件顺序正确!
布莱恩(Brian)

@Joshua说句公道话,如果不是的话,那么您的命名工作就很糟糕。
jpmc26

@ jpmc26:您知道FAT32不良的目录重新排序习惯吗?
约书亚


8

经过测试的代码,最初创建一个存档文件,然后将其拆分:

 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字节。


1
那就是split已经做的。
短暂

1
,我挖了一些帖子,只是为了找那个。我在特定设备上没有split或zip命令/二进制文件,并且该设备运行良好。我将准备将此代码用作split命令:)。非常感谢@Adrian Panasiuk。对我来说这很完美。
m3nda

@ erm3nda不客气,很高兴能为您提供帮助!
Adrian Panasiuk

但是,我已经测试过,结果是一个完整的文件,没有拆分。怎么会这样?在小型设备上是一个大文件,所以过程很漫长。请在发布时测试您的解决方案:(
m3nda 2015年

@ erm3nda您从未告诉过我们,您需要避免创建临时文件!请参阅第二个变体!
Adrian Panasiuk'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.