如何使用 tar 为多卷存档建立索引?

如何使用 tar 为多卷存档建立索引?

我正在使用 GNUtar创建多卷档案:

DIR=~/temp
BLOCKSIZE=500M
tar cMf multi-0001.tar --new-volume-script=volume-script.sh --tape-length=$BLOCKSIZE $DIR

我想创建一个显示每个卷内容的文件列表。我尝试添加多个--verbose选项,虽然这确实为我提供了所有正在存档的文件的列表,但它并没有告诉我它们位于哪个卷中。

我知道我可以使用该--list命令再次通过 tar 运行每个卷,但我希望避免两次处理所有数据。

(供参考,内容volume-script.sh如下;我不认为它与问题相关

#! /bin/bash
echo multi-$(printf "%04d" $TAR_VOLUME).tar >&$TAR_FD

编辑:问题已撤回

这个问题包含一个错误的假设。这在后续问题的答案中得到了证实--list是在可查找媒体上创建索引文件的完全可接受的方式。我的解决方案现在看起来像这样:

DIR=~/temp
BLOCKSIZE=500M
tar cMf multi-0001.tar --new-volume-script=volume-script.sh --tape-length=$BLOCKSIZE $DIR

for i in *.tar;
 do echo q | tar --list -M -f $i --verbose --verbose > $i.index.txt 2>/dev/null;
done

答案1

我认为你所要求的只是: tar tvf filename

这会创建 tar 文件中内容的列表,而无需打开它。创建 tar 存档后,您必须运行它,但它应该会为您提供所需的内容。

您可以简单地将其链接到 tar 命令后面,方法如下: tar cMf multi-0001.tar --new-volume-script=volume-script.sh --tape-length=$BLOCKSIZE $DIR ; tar tvf multi-0001.tar > multi-001-listing.txt

答案2

可能有一种我忽略的简单方法可以做到这一点,但我认为您可以让卷脚本从详细索引输出中提取新名称。像这样的东西(未经测试):

export templisting=$(mktemp)
export tempoffset=$(mktemp)
DIR=~/temp
BLOCKSIZE=500M
tar cvMf multi-0001.tar --index-file=$templisting --new-volume-script=volume-script.sh --tape-length=$BLOCKSIZE $DIR
rm $templisting $tempoffset

在volume-script.sh中(使用logtail,可以不使用):

#! /bin/bash
echo multi-$(printf "%04d" $TAR_VOLUME).tar >&$TAR_FD
listingfile= #however you want to name listing files.
logtail -f$templisting -o$tempoffset > $listingfile

相关内容