将 6 GB 的 TAR 文件分割成单独的 1.9 GB TAR 文件

将 6 GB 的 TAR 文件分割成单独的 1.9 GB TAR 文件

我的目录中有 28,000 个大小为 6.7 GB 的文件aaa/input

我需要在目录中创建 TAR 文件aaa/output,这样每个 TAR 文件不能超过 1.9 GB,因此我必须将 28,000 个文件打包为 4 个 TAR 文件(6.7/1.9),如下所示

Log_(current date)_01.tar
Log_(current date)_02.tar
...
etc.

使每个 tarball 小于 1.9 GB。

有没有办法使用 Unix 脚本来做到这一点?

答案1

您可以tar结合使用来split实现此目的:

tar cf - aaa/input | split --bytes=1900m --filter='gzip > $FILE.gz' --numeric-suffixes - ./Log-

此命令创建一个tar存档到 stdout 并将输出通过管道传输到split将按每 1900MB 分割的命令,通过 gzip 过滤数据,使用 stdin 作为输入(the -)并将输出放置在带有前缀的当前目录中Log-

输出将如下所示:

./Log-00.gz
./Log-01.gz
..

文件的大小会更小,因为split将分割为 1900M 的输入,压缩后会更小。

或者你可以使用

printf 'n Log-%02d.tar\n' {2..4}|tar cf Log-01.tar -ML1900m aaa/input

创建档案。

n命令中的第一个printf命令将指示tar为下一个存档使用新名称。这也是范围从 2 开始的原因。

通常,当 tar 提示输入新存档时,会显示以下内容:

Prepare volume #2 for '<my tar file>' and hit return:

当您按下时,?会显示一个简短的菜单:

 n name        Give a new file name for the next (and subsequent) volume(s)
 q             Abort tar
 y or newline  Continue operation
 !             Spawn a subshell
 ?             Print this list

答案2

如果您可以运行 GNU tar,则可以使用选项--tape-length=N和。--new-volume-script

创建卷的命令如下所示:

tar cvf volume /path/to/files --tape-length=1945M --new-volume-script=/path/to/script.sh

并从中提取所有内容:

tar xvf volume --new-volume-script=/path/to/script.sh

为了新卷脚本您可以使用以下一个(来自targnu.org 上的文档)。它适用于卷创建、列出、比较和提取。或者您可以修改它以更改卷的名称,或者从头开始编写自己的卷名称。检查手册页以获取可用的环境值。

#! /bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
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

相关内容