Tar 分裂成独立卷

Tar 分裂成独立卷

我有一些目录的数据超过 100Gb。我正在尝试将它们归档为较小的卷,即每个 10Gb独立/独立

问题是如果我使用tar+ split,它会导致多个不独立的 tar 部分。我不能只从其中一个部分提取文件,除非我首先将所有内容合并到一个大文件中。

我也尝试过使用tar -c -L1000M ...分割卷,但这也不起作用,并且存在长文件名被截断的问题。

也尝试过star,但似乎它的分卷也不是独立的;而 7zip 不保留 UNIX 中的权限。

我希望拥有独立的分割档案的原因是出于安全目的,万一其中一个分割文件损坏,我仍然可以从其他档案中检索数据。如果我只想提取特定的文件/文件夹,而不需要将所有档案合并回一个大卷,它也会快得多。

我怎样才能最好地实现这一目标?谢谢。


找到解决方案

我已经找到了使用 tar 的解决方案,正如 @Haxiel 的答案所建议的。答案已发布在下面。

请注意,如果文件跨越卷的边界并且您没有可用的下一个卷,则仍然可能会丢失一两个文件,但即使其他部分丢失,至少可以独立提取单独的卷。

答案1

我找到了使用 tar 的解决方案,正如 @Haxiel 的答案所建议的。使用的命令是这样的:

tar -c -L1G -H posix -f /backup/somearchive.tar -F '/usr/bin/tar-volume.sh' somefolder

-L:定义存档大小限制,即 1 Gb

-H:必须使用 posix 格式,否则长文件名会被截断

-F:需要卷脚本来生成 tar 的连续存档文件名

该命令将创建一个多卷存档,格式为somearchive.tar、somearchive.tar-2、somearchive.tar-3...

下面是我的tar-volume.sh,改编自此教程

#!/bin/bash

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE
name=`expr $TAR_ARCHIVE : '\(.*\)\(-[0-9]*\)$'`

case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
          ;;
*)        exit 1
esac

echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

要列出第三个存档卷的内容:

tar -tf /backup/somearchive.tar-3

要提取特定的存档卷:

tar -xf /backup/somearchive.tar-3

请注意,如果您仅提取 1 个卷,则可能存在不完整的文件,这些文件在存档的开头或结尾处被分割到另一个卷。 Tar 将创建一个名为的子文件夹GNUFileParts.xxxx/文件名其中包含不完整的文件。

要在 Unix 中提取整个卷集,您需要再次通过卷脚本运行它:

tar -xf /backup/somearchive.tar -F '/usr/bin/tar-volume.sh'

如果您在 Windows 中提取它们,tar 命令无法正确运行卷脚本,因为这需要 bash shell。您需要首先运行以下命令,在命令行手动输入卷文件名:

tar -xf somearchive.tar -M

-M表明这是一个多卷存档。当 tar 完成提取第一个卷时,它会提示您输入下一个卷的名称,直到提取所有卷。

如果有很多卷,您可以先键入所有卷名称序列,然后在提取第一个卷后将整个批次复制并粘贴到 tar 的命令行提示符中:

n somearchive.tar-2
n somearchive.tar-3
n somearchive.tar-4

请注意n前面是一个tar命令,表示后面的参数是新的卷文件名。

如果文件跨越卷的边界并且您没有可用的下一个卷,则仍然可能会丢失一两个文件,但即使其他部分丢失,至少可以独立提取单独的卷。

欲了解更多信息,请参阅焦油文档。 H

答案2

这不是一个完美的解决方案,但 GNUtar的多卷存档似乎很接近您正在寻找的内容。您的问题中已经提到了此选项,但我想添加来自GNUtar手册这澄清了为什么这是一个可能的选择:

多卷存档是单个 tar 存档,存储在多个固定大小的媒体卷上。尽管在本节中我们通常将“卷”称为磁带,但绝对不需要将多卷存档存储在磁带上。相反,它们可以使用用户认为方便的任何媒体类型,甚至可以位于文件上。

创建多卷存档时,GNU tar 会继续填充当前卷,直到空间用完,然后切换到下一个卷(通常要求操作员更换此时的磁带),并继续处理新卷。此操作将持续进行,直到转储所有请求的文件。如果 GNU tar 在转储文件时检测到媒体结尾,则此类文件将以拆分形式存档。 一些非常大的文件甚至可以分为多个卷。

每个卷本身都是一个有效的 GNU tar 存档,因此无需任何特殊选项即可读取。因此,完全驻留在一个卷上的任何文件成员都可以被提取或以其他方式操作,而不需要另一卷。果然,要提取拆分成员,您需要其各部分所在的所有卷。

多卷档案受到一些限制。特别是,它们不能被压缩。

根据此定义,唯一会出现问题的文件是跨大小边界分割的文件。完全包含在单个卷中的文件可以被视为独立于其他卷。

对于每个卷,可以使用该-v选项来识别分割文件。

$ tar -tf multi-test2.tar -v
M--------- 0/0          658432 1970-01-01 03:00 file1--Continued at byte 7341568--
-rw-r--r-- test/users 4000000 2019-03-06 12:12 file2

可以像使用单个存档一样提取完全包含的文件。tar似乎抱怨分割文件不完整,但它能够毫无问题地提取完整的文件。

还可以使用该选项将分割文件作为单个单元从多个卷中提取-M,这将提示您提供下一个卷的名称。用法已记录这里。相反,如果您希望将卷连接到单个存档,则可以考虑tarcat实用程序以及。

答案3

(写为新答案,因为我还不能发表评论)

作为评论中确实提到了这可能不适用于 MacOS tar

只是想指出你可以通过brew在mac上安装gnu-tar:

brew install gnu-tar

然后使用gtar而不是tar

答案4

如果你使用

star -c tsize=1G ...

您将获得以独立方式分割的 tar 档案。

请小心指定足够的f=filename选项以将所有存档保存在不同的文件中。f=考虑到并非所有存档都达到完整大小这一事实,您需要根据需要指定尽可能多的选项。

相关内容