Как извлечь архив из этого скрипта (используя tar)

Совершенно не знаю, как распаковать созданный архив. Я даю вам полный сценарий. Distibution на основе Debian под названием Univention использует это для резервного копирования нескольких файлов в tar-архиве.

Настоящий архив запакован в функцию. Основное содержимое, в котором они создают фактический tar-файл:

cat "$TMPDIR/freeinfo.txt" >> "$TMPDIR/Installinfo.txt" 2>/dev/null
echo >$TMPDIR/endtag.txt
echo "%%%%OXBACKUP_${DATE}_HEADER_ENDTAG" >> "$TMPDIR/endtag.txt"

BACKUPINFO="$BACKUPINFO endtag.txt"


cat 2>/dev/null << EOF > "$TMPDIR/Installinfo.sh"
BACKUPHOSTNAME="$hostname"
BACKUPDOMAINNAME="$domainname"
BACKUPBASEDN="$ldap_base"
BACKUPTIMEZONE="$(cat /etc/timezone)"
BACKUPLANG="$(echo $locale_default)"
BACKUPSAMBADOM="$windows_domain"
BACKUPSAMBAINSTALLED="$SAMBAINSTALLED"
BACKUPOXINTEGRATIONVERSION="$INTEGRATIONVERSION"
BACKUPSECLEVEL="$(univention-config-registry get version/security-patchlevel)"
BACKUPVERSION=2
SECRETFILES="$SECRETFILES"
OTHERFILES="$OTHERFILES"
OXCONFIG="$OXCONFIG"
CRONTABS="$CRONTABS"
CERTFILES="$CERTFILES"
EOF

pstatus=()

#
# the actual backup to stdout
#
    sync ; sync ; sync

RETVAL=$(
(tar cO $BACKUPINFO 2>/dev/null
tar cO $SECRETFILES 2>/dev/null
tar cO $OTHERFILES 2>/dev/null
tar cO $OXCONFIG 2>/dev/null
tar cO $CRONTABS 2>/dev/null
tar cO $CERTFILES 2>/dev/null
[ -f $EXTRAFILES ] && tar --no-recursion -T $EXTRAFILES -cO 2>/dev/null
tar --no-recursion --null -T dirlist_mailandfilestore -cO 2>/dev/null
tar --null -T filelist_mailandfilestore -cO 2>/dev/null
tar --no-recursion --null -T dirlist_shares -cO 2>/dev/null
tar --null -T filelist_shares -cO 2>/dev/null
) |

#help us out with smbclient, perl, scp until we get a working curl

case "$BACKUPPROTOCOL" in
##stripped protocol specific stuff ... (*) is the way to go!

        (*)     dd 2>>${LOGFILE}_${DATE} > ${BACKUPPATH:-$DEFAULTBACKUPPATH}/backup_$DATE && echo "201"

                chmod 640 "${BACKUPPATH}/backup_$DATE" >/dev/null 2>&1
                chown root:www-data "${BACKUPPATH}/backup_$DATE" >/dev/null 2>&1

                if [[ x"$BACKUPPATH" != x && "$BACKUPPATH" != "$DEFAULTBACKUPPATH" ]] ; then
                        # temporary permissions fix
                        ln -sf "${BACKUPPATH}/backup_$DATE" "$DEFAULTBACKUPPATH/"
                fi
        ;;

esac
)

размер архива в системе 54 ГБ, tar xvf извлекает только первый уровень архива. Извините, сложно объяснить. В целом я получаю только 40 МБ из этих 54 ГБ. Все директории, которые должны быть в архиве, не извлекаются.

Использование $ ((tar ... tar ...) | dd> foo)

мне тоже совершенно неизвестно, что делает этот скрипт?

Думаю, я сам нашел решение (немного обновил скрипт): скрипт генерирует тег, который отмечает конец первого архива. Я использовал grep -A1 -a -b "HEADER_ENDTAG" backup.tar Значение было 41247795 dd skip = 41247795 if = .. / .. / backup of = test

Похоже, теперь я могу извлечь "настоящий" архив. Есть ли другой способ автоматически перейти к этому байтовому смещению, например без использования grep вручную?


person evildead    schedule 18.10.2009    source источник
comment
Сценарий готов? Вы уверены, что так работает? tar в Debian не работает с параметром c0.   -  person theomega    schedule 19.10.2009
comment
да работает, тесте тоже на ленни. Попробуйте сами: $ ((tar --null --no-recursion / etc / -cO; tar --null / etc / -cO) | dd ›foo) И попробуйте распаковать полностью и т. Д. Нет, сценарий не завершен. Должен ли я опубликовать полную вещь?   -  person evildead    schedule 19.10.2009
comment
Забудьте мой комментарий (но посмотрите мой ответ), я взял O (буква) за 0 (число, ноль).   -  person theomega    schedule 19.10.2009
comment
о, я думаю, что нашел решение. есть тег, который отмечает конец первого архива: Я использую grep -A1 -a -b HEADER_ENDTAG ../../backup, чтобы найти bytecount. Теперь использование dd skip = 41247795 if = .. / .. / backup of = test дает мне добавленный архив. Маленькие хитрые ...   -  person evildead    schedule 19.10.2009


Ответы (1)


Ваш сценарий, кажется, объединяет несколько файлов tar в один большой файл. Чтобы извлечь один раздел, я использую функцию / скрипт оболочки, подобную этой:

Раздел файла:

#!/bin/sh
tar_section() {
   local x=1;
   while [ $x -lt $1 ]; do
      tar t > /dev/null || echo "Error in section $x" >&2
      x=$(( $x+1 ))
   done
   shift
   tar f - "$@"
} 

tarfile="$1"
shift
tar_section "$@" < "$tarfile"

Затем вы можете сделать (например, для части 3 большого файла):

tarsection YOUR_54GB_BACKUP_FILE 3 -t | less
cd ...extractlocation
tarsection YOUR_54GB_BACKUP_FILE 3 -x
person Gregor    schedule 21.10.2009
comment
Это оно. Большое тебе спасибо! - person evildead; 22.10.2009