我们的服务器的目录结构是这样的
- /主页/site1/public_html
- /主页/site1/日志
- /home/site1/cgi-bin
- 等等...(这是使用 virtualmin 时的标准)
我想要安排备份的是 public_html 目录 + site1/ 级别的一些文件(这些级别上通常会写一些方便的脚本,但也不可避免地会有一堆膨胀文件,例如临时数据库转储,我不希望每次作业时它们都填满备份服务器)
如果可能的话,我想做的事情如下(从 /home/ 开始):
tar -cz --include="*.sh" --include="*.php" --include="public_html/*" ./site1/ | ssh backupserver ...
但是,tar 没有包含选项,只有排除。
我试过了
find ./site1/ -type f -name "*.sh" -or -name "*.php" -or -wholename "./site1/public_html/*" | xargs tar -cz | ssh backupserver ...
但这也不起作用,因为 xargs 将大量文件列表分成几块,导致每次重新启动 tar -c 命令都会覆盖前一个文件(如果我不使用 xargs,则会出现列表太长的错误)。
我无法使用 -r 选项附加到备份,因为 1) 它不适用于压缩档案,并且 2) 无论如何我认为它无法通过 ssh 工作。
我能想到的唯一解决方案是将其分为几个步骤:在本地创建一个临时 tar 文件(一个步骤是 tar ./site1/public_html/,另一个步骤是附加 ./site1/*.[sh|php]),然后压缩,然后 ssh,然后删除本地文件。但这在 Linux 上似乎有点荒谬。
我可以使用 tar 命令中我遗漏的某些格式吗?
答案1
globstar
去救援?
shopt -s globstar
tar -cz archive.tar.gz file1 file2 subdir/**
答案2
pax
,这是你大放异彩的时刻!
find ./site1/ \( -path "./site1/public_html" -prune -o -name "*.sh" -o -name "*.php" \) -print |
pax -x ustar -wf archive.tar
或者当您有一个find
并且pax
都支持 NUL 分隔数据时:
find ./site1/ \( -path "./site1/public_html" -prune -o -name "*.sh" -o -name "*.php" \) -print0 |
pax -x ustar -0wf archive.tar