使用tar、gz、zip或bzip2来分割文件。

150
我需要压缩一个大约17-20 GB的文件。我需要将其分割成每个文件大小约为1 GB的几个文件。
我通过谷歌搜索找到了使用splitcat命令的方法。但对于大文件来说,它们根本不起作用。而且它们在Windows上也不可用;我需要在Windows机器上提取它。

3
我理解你的感受,但这似乎与编程无关。 - Jason S
1
许多压缩程序(例如7-Zip)都能将压缩文件拆分成指定大小的卷,以便更容易地进行分发。 - Martin Liversage
这个问题应该发在superuser.com上,但据说私人测试版要到明天才开始。 - JesperE
请问您为什么需要压缩那个文件? - Jan Jungnickel
如果这个问题与编程无关,我们能否将其移动到Superuser论坛?因为它仍然相关。 - Nikhil VJ
显示剩余2条评论
4个回答

265
你可以使用 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
3
实际上使用“-b 1024MiB”会出现一个错误,提示字节数量无效。使用“--bytes=1024m”可以正常工作。 - Engineer2021
你不必使用 cat 来重新组装文件。在 Windows 上,你可以使用 copy /b file1 + file2 + etc..,然后将其复制回 Linux,tar 可以读取重新组装的 tarball。我刚试过了。 - Engineer2021
1
Split有一个选项--numeric-suffixes:使用数字后缀而不是字母。 - Dr. Jan-Philip Gehrcke
如果您喜欢使用原始前缀来避免使用bash变量猜测前缀名称,请使用:file=myfile.tar.gz,然后跟随 split -b 1024m $file ${file}-part-。重新组装使用 cat ${file}-part-* > $file - Sebastian Müller
在分割大文件时使用“--verbose”选项是个好主意。 - HadiRj

29

如果你在Linux上分割文件,仍然可以在Windows上重新组装。

copy /b file1 + file2 + file3 + file4 filetogether

1
你也可以使用 copy /b file* filetogether -- http://support.microsoft.com/kb/71161 - eug
6
只有在使用 NTFS 并且文件已经按照 NTFS 排序的情况下才能正常运作。如果尝试在 FAT 或 FAT32 上使用会出现问题。 - Joshua
+1 确保文件顺序正确! - Engineer2021
2
@Joshua 公平地说,如果它们不是,那么你的命名工作做得很差。 - jpmc26
@jpmc26:你知道FAT32的不良目录重新排序习惯吗? - Joshua

10

9

测试代码,首先创建一个单一的归档文件,然后将其拆分:

 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 已经做的事情了。 - ephemient
1
ephemient,嘿,我找了一些帖子,就是为了找这个。在某个设备上,我没有split或zip命令/二进制文件,而这个代码完美地解决了这个问题。我将准备好这段代码作为split命令的替代。非常感谢@Adrian Panasiuk。这对我来说太完美了。 - m3nda
@erm3nda 不用谢,很高兴能帮到你! - Adrian Panasiuk
但是,我已经测试过了,结果是一个完整的文件,而不是分割的。这怎么可能呢?因为在小设备上有一个大文件,所以处理时间很长。请在发布时测试您的解决方案 :( - m3nda
昨天我使用 7zip 的 -v200m 选项解决了我的问题。但后来我回头测试了你的方法,发现了我的错误 :D - m3nda
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接