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

递归地创建文件夹的新tar文件,不包括包含在另一个tar文件中的文件

  •  -1
  • Jack_Hu  · 技术社区  · 7 年前

    每天晚上,tar文件都会更新以包含当天的新电子邮件,并通过ftp下载到备份服务器。

    为了解决这个问题,我决定最好创建一个新的tar文件,其中包含所有邮件,除了昨晚备份中已经存在的邮件。所以最后只有那天的新文件。

    最后,我可以将新的tar文件合并到两台服务器的主服务器上,为第二天做好准备。

    有什么办法吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   malyy    7 年前

    使用 tar 具有 find 下面是要创建的示例脚本 full incremental 备份使用 和 焦油

    #!/bin/bash
    bkdir="/home/backup"
    bklog="/var/log/backup.log"
    dbkdir="/home/backup/files/daily"
    wbkdir="/home/backup/files/weekly"
    
    
    curdate=`date +%Y-%M-%d-%H:%M:%S`
    ardate=`echo $curdate  | sed -e 's/:/_/g' -e 's/-/_/g'`
    wday=`date +%a`
    
    files_full_backup () {
      echo -e "Archiving files...n"
      tar cjpf "$1/full_files_$ardate.tar.bz2" "$bkdir"
    }
    
    files_inc_backup () {
      echo -e "Archiving files...n"
      find $bkdir -mtime -1 -exec tar cvjpf "$1/inc_files_$ardate.tar.bz2" {} ;
    }
    
    ### add some choice what kind of backup to do - full or incremental
    if [ $wday != Sun ]
      then
        echo -e "As today is not Sunday - I'll start incremental backup.n"
        files_inc_backup $dbkdir
      else
        echo -e "As today is Sunday - I'll start full backup.n"
        files_full_backup $wbkdir
    fi
    

    使用 仅限(增量备份)

    man tar 显示具有“增量功能”:

    -g, --listed-incremental=FILE
                  Handle new GNU-format incremental backups.  FILE is the name of a snapshot file, where tar stores addi‐
                  tional information which is used to decide which files changed since the previous incremental dump and,
                  consequently, must be dumped again.  If FILE does not exist when creating an archive, it will  be  cre‐
                  ated  and  all  files will be added to the resulting archive (the level 0 dump).  To create incremental
                  archives of non-zero level N, create a copy of the snapshot file created during the level N-1, and  use
                  it as FILE.
    
                  When listing or extracting, the actual contents of FILE is not inspected, it is needed only due to syn‐
                  tactical requirements.  It is therefore common practice to use /dev/null in its place.
    

    tar --create --file=`date +%s`.tbz2 --bzip --listed-incremental=example.snar --verbose example/
    

    或简称:

       tar -cvjg example.snar -f `date +%s`.tbz2  example/
    

    要恢复备份,需要将bcakup的所有部分从最旧解包到最新:

     tar --extract --incremental --file level0.tar
     tar --extract --incremental --file level1.tar
     tar --extract --incremental --file level2.tar
    

    或者,简而言之:

       for i in *.tbz2; do tar -xjGf "$i"; done;
    

    #!/bin/sh
       SOURCE="$1"
       test -d "$SOURCE" || exit 1
    
       DEST_DIR=`date +%G-%V`; #weekly
       #DEST_DIR=`date +%Y-%m`; #monthly
    
       mkdir -p $DEST_DIR;
       shift;
       tar --create "$@" --preserve-permissions --totals --bzip \
       --file="$DEST_DIR"/`date +%F-%s`.tbz2 \
       --listed-incremental="$DEST_DIR"/backup.snar \
       --no-check-device --exclude-vcs \
       --exclude-tag-under=access.log --exclude='*.log' \
       --exclude-caches --exclude-tag-under=IGNORE.TAG "$SOURCE"
    

       ./backup.sh example/ -v