Я использую GNU tar
для создания многотомных архивов:
DIR=~/temp
BLOCKSIZE=500M
tar cMf multi-0001.tar --new-volume-script=volume-script.sh --tape-length=$BLOCKSIZE $DIR
Я хочу создать список файлов, который показывает содержимое каждого тома. Я пробовал добавлять несколько опций --verbose
, и хотя это дает мне список всех архивируемых файлов, это не говорит мне, в каком томе они находятся.
Я знаю, что могу прогнать каждый том через tar снова, используя команду --list
, но я бы предпочел избежать двойной обработки всех моих данных.
(Для справки, содержимое 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
Это может быть простой способ, который я упускаю из виду, но я думаю, что вы можете заставить свой скрипт тома извлекать новые имена из подробных выходных данных индекса. Примерно так (непроверено):
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
Я думаю, что вы просите просто:
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 -isting.txt