创建一个 tar 存档,分成最大大小的块

Naf*_*Kay 102 tar backup

我需要备份一个相当大的目录,但我受到单个文件大小的限制。我想基本上创建一个tar.(gz|bz2)档案,该档案被分成 200MB 的最大档案。Clonezilla 通过拆分像这样命名的映像备份来做类似的事情:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个命令中做到这一点?我了解如何使用该split命令,但我不想创建一个巨大的存档,然后将其拆分为较小的存档,因为这将使我最初创建存档所需的磁盘空间增加一倍。

jor*_*anm 139

您可以通过管道将 tar 传输到 split 命令:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.
Run Code Online (Sandbox Code Playgroud)

在某些 *nix 系统(如 OS X)上,您可能会收到以下错误:

split: illegal option -- -
Run Code Online (Sandbox Code Playgroud)

在这种情况下,试试这个(注意-b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.
Run Code Online (Sandbox Code Playgroud)

如果您碰巧尝试拆分文件以适合 FAT32 格式的驱动器,请使用 4294967295 的字节限制。例如:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
Run Code Online (Sandbox Code Playgroud)

当您要提取文件时,请使用以下命令(如@Naftuli Kay 评论的那样):

cat sda1.backup.tar.gz.* | tar xzvf -
Run Code Online (Sandbox Code Playgroud)

  • 请问`cat sda1.backup.tar.gz.* | tar xzvf -` 做这项工作吗? (27认同)
  • 是的,应该。`split` 默认设置文件名称,以便按 LOCALE(由 shell globbing 完成)排序时将按正确顺序排列。 (4认同)
  • 没有冗长,只做 `tar czf ...` 没有 `v` 并通过 `cat backup.tar.gz.* 合并 | tar tar xzf - ` 没有 `v`。我看不到 `v` 的详细输出有什么好处。 (4认同)

小智 21

tar分割存档

我发现这是最好的解决方案,原因如下:

  • 它无需交互即可创建零件,自动命名零件
  • 您可以使用任何您想要的压缩,常用tar选项
  • 不需要外部命令来进行拆分或合并
  • 不使用额外的磁盘空间(中级)
  • 任何 dearchiver 都可以轻松处理,因为每个存档都是独立的
  • 提高安全性,因为每个存档都是独立的,文件不会跨越多个存档

此命令创建 2GB 块而不压缩:

tar -cv --tape-length=2097000 --file=my_archive-{0..50}.tar file1 file2 dir3
Run Code Online (Sandbox Code Playgroud)
  • c用于创建
  • v表示详细,列出添加到存档中的文件
  • --tape-length是块大小:您可以添加后缀,如果省略它,则假定为 KB(因此 2 GB 为 200 万)
  • --file是我们神奇地为块创建名称的地方:我们任意给出 50 个,但您可以输入任何足够大的数字,只有那些需要的才会被使用
  • 要包含在档案中的文件和目录列表

类似地,此命令通过gzip压缩创建 1GB 块:

tar -czv --tape-length=2097000 --file=my_archive-{0..50}.tar.gz file1 file2 dir3
Run Code Online (Sandbox Code Playgroud)

  • 之后如何解压文件? (5认同)
  • 我会使用 `--file=my_archive.tar.gz.{00..50}` 来代替,原因有两个:首先,将数字放在末尾表示该文件只是较大存档的一部分。其次,当使用 cat 重新组合文件时,使用固定宽度的数字可以正确地对文件进行排序。 (4认同)
  • 请注意(我很确定)“tar”文件不会在文件边界处被破坏,这意味着一半文件可以位于一个 tar 存档中,另一半位于下一个 tar 存档中。至少,从我在尝试提取单个 tar 存档时看到的错误来看似乎是这种情况(“存档中出现意外的 EOF”)。只是提到这一点是为了帮助处于我这种情况的其他人。如果我错了,请纠正我。 (2认同)
  • @MacMladen 这是结果。`tar -cz --tape-length=209700 --file=my-ubuntu22-fs-{00..50}.tar.gz ubuntu22-fs` tar:无法使用多卷压缩档案尝试 'tar --help ' 或 'tar --usage' 了解更多信息。 (2认同)

Eri*_*lun 14

在 macOS 上,该split命令的工作方式略有不同:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
Run Code Online (Sandbox Code Playgroud)


小智 5

只是补充一下:由于 vfat/fat32 中允许的最大文件大小为 2^32 减 1(4294967295 字节),因此在此类文件系统上允许的最大文件大小的 split 命令为:

split -b4294967295 -d my_input_file my_output_file_splitted
Run Code Online (Sandbox Code Playgroud)