tar 可以使用 -T/-I 参数来读取列表,-X 读取排除列表,但列表生成以后,其中某些文件可能会被删除,例如 web 产生的一些 cache。这时候运行 tar -T 就会报错并退出,而后续的打包就不再进行。
可能需要忽略这一点,用 --ignore-failed-read 可以,问题就是他不会报告哪些被忽略了。我想可以在使用的使用 wrap 这个参数,由用户来进行选择,再传递给 tar 处理。
如果同时使用 -T i-files -X x-files 会怎样呢?
sh$ find `pwd`/lamp01 >i-files会发现很多重复的项,而且 tar 归档的大小是普通情况下的 3 倍,这意味着同时使用 -T/-X 选项会有问题。因此如果要排除某个目录,只能将希望放在 find 上了——如果使用 shell script 或在 python 中使用 os.popen() 直接调用这些命令来实现的时候。
sh$ echo "/tmp/temp/lamp01/profiles" >x-files
sh$ tar -c -z -f lamp01.tgz -T i-files -X x-files /tmp/temp/lamp01
sh$ tar tfz lamp01.tgz | grep profiles | sort
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
例如可以使用如下命令:
find `pwd`/lamp01 -path `pwd`/lamp01/profiles -prune -o -print | grep profiles这里最好使用绝对路径,在备份的这个脚本设计中也最好使用绝对路径,能够避免很多混乱的情况!可以使用 tar -P 参数。
如果要排除两个目录:
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles -o -path /tmp/temp/lamp01/confiles \) -prune -o -print | grep profiles对一个目录也同样可以使用 \(\):
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles \) -prune -o -print即便是有不相干的目录加入进来也没有关系
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles -o -path /etc \) -prune -o -print不过可以认真考虑一下 backup list 应该以怎样的形式为好?
没有评论:
发表评论