我的目录中有 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
为了新卷脚本您可以使用以下一个(来自tar
gnu.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