代码之家  ›  专栏  ›  技术社区  ›  evildead

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

  •  0
  • evildead  · 技术社区  · 16 年前

    我绝对不知道如何解包创建的档案。我给你完整的剧本。 一个基于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 GB,tar xvf仅提取第一级存档。对不起,很难解释。总之,我只从54GB中得到40MB。所有应该在存档中的目录都不会被提取。

    使用 美元((焦油… 焦油…“DD & GT;FoO”

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

    我想我自己找到了一个解决方案(我稍微更新了一下脚本): 脚本生成标记第一个存档结束的标记。 我用了grep-a1-a-b“header-endtag”backup.tar 值为41247795 dd skip=41247795,如果=../../backup of=test

    看来我现在可以提取“真实”档案了。是否有其他方法可以自动跳转到此字节偏移量,例如不手动使用grep?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Gregor    16 年前

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

    文件tarsection:

    #!/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
    
    推荐文章