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

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

我需要备份一个相当大的目录,但我受到单个文件大小的限制。我想创建一个tar.(gz|bz2)存档,该存档被分成最大 200MB 的存档。 Clonezilla 通过分割映像备份来执行类似的操作,如下所示:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

有没有一种方法可以用一个命令来完成此操作?我了解如何使用该split命令,但我不想创建一个巨大的存档,然后将其拆分为较小的存档,因为这将使我最初创建存档所需的磁盘空间增加一倍。

答案1

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

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

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

split: illegal option -- -

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

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

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

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.

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

cat sda1.backup.tar.gz.* | tar xzvf -

答案2

tar分割存档

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

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

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

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

类似地,此命令将创建 1GB 的块,其中压缩包压缩:

tar -czv --tape-length=2097000 --file=my_archive-{0..50}.tar.gz file1 file2 dir3

答案3

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

$ tar cvzf - foo | split -b 2500m - foo.tgz.

答案4

serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

您需要一个脚本来自动将pseudo-tape.tar 文件移动到新名称:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"

相关内容