【问题标题】:Split files using tar, gz, zip, or bzip2 [closed]使用 tar、gz、zip 或 bzip2 拆分文件 [关闭]
【发布时间】:2010-11-10 08:14:52
【问题描述】:

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

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

【问题讨论】:

  • 我感觉到你的痛苦,但这似乎与编程无关。
  • 许多压缩程序(例如 7-Zip)能够将压缩文件分割成指定大小的卷以便于分发。
  • 这属于 superuser.com,但有人告诉我,私人测试版要到明天才能开始。
  • 请问您为什么需要压缩该文件?
  • 如果此处发布的两个可行解决方案之一没有成功,他将需要一个编程解决方案。

标签: linux bash file-io compression


【解决方案1】:

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

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

【讨论】:

  • split 已经这样做了。
  • ephemient 嘿,我已经挖了一些帖子来寻找这个。我在某个设备上没有 split 或 zip 命令/二进制文件,而且这个设备运行良好。我将准备此代码以用作拆分命令:)。非常感谢@Adrian Panasiuk。这对我来说很完美。
  • @erm3nda 不客气,很高兴它有帮助!
  • 但是,我已经测试过,结果是一个完整的文件,而不是拆分。怎么会这样?在小型设备上是一个大文件,所以是一个漫长的过程。请在发布时测试您的解决方案:(
  • @erm3nda 您从未告诉我们您需要避免创建临时文件!请参阅第二个变体!
【解决方案2】:

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

copy /b file1 + file2 + file3 + file4 filetogether

【讨论】:

  • 你也可以使用copy /b file* filetogether -- support.microsoft.com/kb/71161
  • 只有在 NTFS 上并且文件已经处于 NTFS 排序顺序时才能正常工作。在 FAT 或 FAT32 上试一试 = 繁荣。
  • +1 确保文件顺序正确!
  • @Joshua 说句公道话,如果不是,你的命名工作做得很差。
  • @jpmc26:你知道 FAT32 的不良目录重新排序习惯吧?
【解决方案3】:

使用 tar 到split into multiple archives

有很多程序可以处理 Windows 上的 tar 文件,包括 cygwin。

【讨论】:

    【解决方案4】:

    您可以将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。

    【讨论】:

    • 如果你不添加前缀作为文件名后的最后一个参数来分割你会得到名为 xaa、xab、xac、xad....的文件中的输出。
    • @Charlie,谢谢,我更新了答案。
    • 实际使用-b 1024MiB 给出了一个错误,它是无效的字节数。使用--bytes=1024m 有效。
    • 而且您不必使用cat 重新组合文件。您可以在 Windows 上使用copy /b file1 + file2 + etc..,然后复制回 Linux,tar 可以读取重新组装的 tarball。我刚试过。
    • Split 有--numeric-suffixes 选项:使用数字后缀而不是字母。
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多