gpt4 book ai didi

linux - 如何从此脚本中提取存档(使用 tar)

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:04 25 4
gpt4 key购买 nike

我完全不知道如何解压缩创建的存档。我给你完整的脚本。名为 Univention 的基于 Debian 的发行版使用它来备份 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 GB,tar xvf 仅提取存档的第一级。对不起很难解释。总而言之,我只能从这 54GB 中获得 40MB。所有应该在存档中的目录都没有被提取。

使用$(( tar ... tar ...) | dd > foo)

我也完全不知道,这个脚本是做什么的?

我想我自己找到了解决方案(我稍微更新了脚本):脚本生成一个标记第一个存档结束的标记。我用了 grep -A1 -a -b "HEADER_ENDTAG"backup.tar值为 41247795dd skip=41247795 if=../../backup of=test

看起来我现在可以提取“真实”文件。有没有另一种方法可以自动跳转到这个字节偏移量,例如不手动使用 grep?

最佳答案

您的脚本似乎将多个 tar 文件连接成一个大文件。要提取单个部分,我使用如下 shell 函数/脚本:

文件分割:

#!/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

关于linux - 如何从此脚本中提取存档(使用 tar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com