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

Linux 使用tar、gz、zip或bzip2拆分文件,linux,bash,file-io,compression,Linux,Bash,File Io,Compression,我需要压缩一个大约17-20GB的大文件。我需要把它分成几个文件,每个文件大约1GB 我通过谷歌搜索了一个解决方案,找到了使用split和cat命令的方法。但它们根本不适用于大文件。而且,它们不会在Windows中工作;我需要在Windows计算机上提取它。经过测试的代码,最初创建一个归档文件,然后将其拆分: gzip -c file.orig > file.gz CHUNKSIZE=1073741824 PARTCNT=$[$(stat -c%s file.gz) / $CHUNK

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


我通过谷歌搜索了一个解决方案,找到了使用
split
cat
命令的方法。但它们根本不适用于大文件。而且,它们不会在Windows中工作;我需要在Windows计算机上提取它。

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

 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 -b 1024m file.tar.gz
它可以使用@的答案在Windows机器上重新组装

copy /b file1 + file2 + file3 + file4 filetogether

Edit:正如@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-Zip)能够将压缩文件拆分为指定大小的卷,以便于分发。这属于superuser.com,但是私人测试版明天才开始,我被告知。我可以问一下你为什么需要压缩文件吗?如果这里发布的两个可行的解决方案中的一个没有成功,他将需要一个编程解决方案。这就是
split
已经做的。ephemient嘿,我已经挖了一些帖子来寻找这个。我在某个设备上没有split或zip命令/二进制文件,这一个工作得非常好。我将准备此代码以用作split命令:)。非常感谢Adrian Panasiuk。这对我来说太完美了。@erm3nda不客气,很高兴能帮上忙!但是,我已经测试,结果是一个完整的文件,而不是分裂。怎么可能呢?是一个小设备上的大文件,所以是一个漫长的过程。请在发布时测试您的解决方案:(@erm3nda您从未告诉我们您需要避免创建临时文件!请参阅第二个变体!如果您不在文件名后添加前缀作为最后一个参数进行拆分,您将在名为xaa、xab、xac、xad的文件中获得输出…@Charlie,谢谢,我更新了我的答案。实际上,使用
-b 1024MiB
时出现了一个错误,即该文件的编号无效字节。使用
--bytes=1024m
可以工作。而且你不必使用
cat
来重新组装文件。你可以在Windows上使用
copy/b file1+file2+等等,
然后复制回Linux,tar可以读取重新组装的tarball。我刚刚尝试过。Split有
--数字后缀
:使用数字后缀而不是字母顺序。您也可以使用
copy/b file*filetogether
——这只能在NTFS上正确工作,并且如果文件已经是NTFS排序顺序的话。在FAT或FAT32=boom上尝试一下。+1确保文件的顺序正确!@Joshua公平地说,如果不是这样,您的命名工作就做得不好。@jpmc26:您知道FAT32的坏目录重新排序habi吗是吗?