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

Aka*_*Aka 137 linux compression bash file-io

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

我通过Google搜索了一个解决方案,并找到了使用splitcat命令的方法.但它们根本不适合大文件.此外,它们不适用于Windows; 我需要在Windows机器上提取它.

mat*_*pie 244

您可以使用split带有以下-b选项的命令:

split -b 1024m file.tar.gz
Run Code Online (Sandbox Code Playgroud)

它可以使用@Joshua的答案在Windows机器上重新组装.

copy /b file1 + file2 + file3 + file4 filetogether
Run Code Online (Sandbox Code Playgroud)

编辑:正如@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, ...
Run Code Online (Sandbox Code Playgroud)

编辑:编辑帖子,因为问题已关闭,最有效的解决方案非常接近此答案的内容:

# 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
Run Code Online (Sandbox Code Playgroud)

该解决方案避免了在(de)压缩时使用中间大文件的需要.使用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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你没有添加前缀作为文件分割后的最后一个参数,你得到名为xaa,xab,xac,xad的文件中的输出.... (7认同)
  • 实际上使用`-b 1024MiB`给出了一个错误,即它是一个无效的字节数.使用`--bytes = 1024m`有效. (2认同)

Jos*_*hua 26

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

copy /b file1 + file2 + file3 + file4 filetogether
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于NTFS,如果文件已经是NTFS排序顺序.尝试使用FAT或FAT32 = boom. (5认同)
  • @Joshua 公平地说,如果他们不是,那么你的命名工作做得很糟糕。 (2认同)

Tim*_*han 9

使用tar 分成多个档案

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


Adr*_*iuk 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
Run Code Online (Sandbox Code Playgroud)

此变体省略了创建单个存档文件并直接创建部件:

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; )
Run Code Online (Sandbox Code Playgroud)

在此变体中,如果存档的文件大小可被整除$CHUNKSIZE,则最后一个部分文件的文件大小为0字节.