繁体   English   中英

递归创建文件夹的新 tar 文件,排除另一个 tar 文件中包含的文件

[英]Create new tar file of a folder recursively, excluding files contained in another tar file

我正在每天备份我的邮件服务器电子邮件。

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

随着时间的推移,这个 tar 文件变得太大而无法处理。

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

然后我可以将这个小得多的文件传输到我的备份服务器。

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

任何想法我怎么能做到这一点?

使用tarfind这是一个使用findtar创建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

仅使用tar (增量备份)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM