我需要备份一个相当大的目录,但我受到单个文件大小的限制。我想创建一个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"