如何创建分成或跨越多个文件的 tar 存档?

Sam*_*mpa 27 linux tar

根据此页面,可以让 tar 创建一个 tar 存档“拆分”为 100 Mb 的文件:

tar -c -M --tape-length=102400 --file=disk1.tar largefile.tgz
Run Code Online (Sandbox Code Playgroud)

问题是这个命令会要求你在第一个文件被填满后以交互方式为下一个文件提供一个新的文件名。

有人知道跳过这个交互步骤的方法,让 tar 自动进行“拆分”吗?

小智 34

您可以为此使用拆分:

tar czpvf - /path/to/archive | split -d -b 100M - tardisk
Run Code Online (Sandbox Code Playgroud)

这告诉 tar 将数据发送到 stdout,然后拆分以从 stdin 中提取数据 - 另外使用数字后缀 ( -d)、-b100M的块大小 ( ) 并使用“tardisk”作为结果文件名的基础(tardisk00、tardisk01、 tardisk02 等)。

之后要提取数据,您可以使用以下命令:

cat tardisk* | tar xzpvf -
Run Code Online (Sandbox Code Playgroud)

  • 小更正,“-d”是数字后缀,而不是前缀。 (2认同)

gee*_*aur 21

查看该--new-volume-script选项,它允许您用不同的机制或生成的文件名替换提示机制。((tar.info)Multi-Volume Archivestar信息页面中。)问题split在于您需要将cat各个部分重新组合在一起才能做任何事情,而多卷存档应该更灵活一些。

  • 谢谢,这就是我要找的!我现在发现这里实际上有一些说明(包括示例):http://www.gnu.org/software/tar/manual/tar.html#Using-Multiple-Tapes (2认同)

小智 8

当然,最好的选择是--new-volume-script选项。

但是,如果您知道文件的大小(在本例中为 largefile.tgz),那么您也可以这样做:

tar -c -M -L 102400 --file=disk1.tar --file=disk2.tar --file=disk3.tar largefile.tgz
Run Code Online (Sandbox Code Playgroud)

概括:

-c = Create
-M = multi-volume
-L 102400 = 100MB files (disk1.tar, disk2.tar, disk3.tar ...)
Run Code Online (Sandbox Code Playgroud)

(对于 -L,根据需要指定多个,以便 tar 文件的总和大于 largefile.tgz)

如果您正在尝试tar目录树结构


小智 6

它会自动创建大小为 1.1GB 的文件,如果您的 tar 大小较大,您可以增加数字,例如 1000 {2..1000},或者您可以增加磁带长度参数的输入。

tar --tape-length=1048576 -cMv --file=tar_archive.{tar,tar-{2..100}} backup.tar.lzma
Run Code Online (Sandbox Code Playgroud)


小智 5

我在这里用更好的解释回答了tar split archive

太长了;

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

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