10.2.3. 用于备份数据的复制脚本

对于目录树下面的数据集,”cp -a“ 命令可以实现常规备份。

对于类似 “/var/cache/apt/packages/“ 目录下面的大量不可覆盖的静态数据集,使用 “cp -al“ 命令来创建硬链接是一种替代常规备份的方式,这样可以高效的利用磁盘空间。

以下是一个用于数据备份的名为 bkup 的复制脚本。它把当前目录下的所有 (non-VCS) 文件复制到父目录下的指定目录中或者远程主机上。

  1. #!/bin/sh -e
  2. # Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
  3. fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;}
  4. fall(){ find . -print0;}
  5. mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;}
  6. FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)"
  7. BKUP="$(basename $(pwd)).bkup";TIME="$(date +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME"
  8. while getopts gcCsStrlLaAxe:h:T f; do case $f in
  9. g) MODE="GNUCP";; # cp (GNU)
  10. c) MODE="CPIOP";; # cpio -p
  11. C) MODE="CPIOI";; # cpio -i
  12. s) MODE="CPIOSSH";; # cpio/ssh
  13. t) MODE="TARSSH";; # tar/ssh
  14. r) MODE="RSYNCSSH";; # rsync/ssh
  15. l) OPT="-alv";; # hardlink (GNU cp)
  16. L) OPT="-av";; # copy (GNU cp)
  17. a) FIND="fall";; # find all
  18. A) FIND="fdot";; # find non CVS/ .???/
  19. x) set -x;; # trace
  20. e) EXTP="${OPTARG}";; # hostname -f
  21. h) HOST="${OPTARG}";; # user@remotehost.example.com
  22. T) MODE="TEST";; # test find mode
  23. \?) echo "use -x for trace."
  24. esac; done
  25. shift $(expr $OPTIND - 1)
  26. if [ $# -gt 0 ]; then
  27. for x in $@; do cp $OPT $x $x.$TIME; done
  28. elif [ $MODE = GNUCP ]; then
  29. mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/"
  30. elif [ $MODE = CPIOP ]; then
  31. mkdir -p "../$BU";chmod 700 "../$BU"
  32. $FIND|cpio --null --sparse -pvd ../$BU
  33. elif [ $MODE = CPIOI ]; then
  34. $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i )
  35. elif [ $MODE = CPIOSSH ]; then
  36. $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )"
  37. elif [ $MODE = TARSSH ]; then
  38. (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )"
  39. elif [ $MODE = RSYNCSSH ]; then
  40. rsync -aHAXSv ./ "${HOST}:${EXTP}-${BKUP}-${TIME}"
  41. else
  42. echo "Any other idea to backup?"
  43. $FIND |xargs -0 -n 1 echo
  44. fi

如上只是一个范例。在你自己使用脚本之前,请阅读此脚本并且修改它。

[提示]提示

我把 bkup 保存在我的 “/usr/local/bin“ 目录。我假定当需要临时快照备份的时候,能够在工作目录不带任何参数运行 bkup 命令。

[提示]提示

如果是要制作源文件树或者配置文件树的快照历史的话,使用 git(7) (参见第 10.6.5 节 “记录配置历史的 Git”) 是更简便并且也是空间高效的。