find/tar 组合用于备份某一级别的某些文件以及某个子目录中的所有文件

find/tar 组合用于备份某一级别的某些文件以及某个子目录中的所有文件

我们的服务器的目录结构是这样的

  • /主页/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

相关内容