rsync include-from, exclude-from 无源目录

rsync include-from, exclude-from 无源目录

我正在编写备份脚本,但是我的脚本出现了一些问题,你能帮助我吗?

INCLUDE="/data/scripts/include.txt"
EXCLUDE="/data/scripts/exclude.txt"
DST="/backupdir"

    rsync \
      --archive \
      --recursive \
      --include-from $INCLUDE \
      --exclude-from $EXCLUDE \
      --hard-links \
      --perms \
      --executability \
      --owner \
      --group \
      --human-readable \
      --verbose \
      --progress \
      --delete-before \
      --stats \
      --timeout=300 \
      -e "ssh -i $SSHKEY" $USER@$IP:$DST
#include
/root
/data
/etc/httpd
/data/lost+found
#exclude
/data/www/html/nextcloud/public_html/data/index.html
/data/www/html/nextcloud/public_html/data/nextcloud.log
/data/www/html/nextcloud/public_html/data/updater.log
/data/www/html/nextcloud/public_html/data/updater-*

我的问题是,我如何告诉 rsync 同步包含文件中的所有内容,排除排除文件中的所有内容,而不给他源路径?

答案1

手册上说你必须有一个源目录。

您应该使用包含文件中的列表作为要循环并进行 rsync 的源目录列表:

for dir in /root /data /etc/httpd
do
    rsync OPTIONS $dir DEST
done

或者,您可以创建您的源目录,并在排除模式中/包含类似的内容。/*

答案2

有人可能会认为 --include-from 中列出的文件是像源参数那样专门搜索的,但 rsync 的工作方式并非如此。

相反,只有指定了 --recursive 时,rsync 才会从指定的源目录向下搜索。找到文件后,rsync 会将它们与 --include-from 进行比较。如果找到匹配项,则该文件被明确包含,并且停止搜索包含/排除项。

出现问题的原因是 --recursive 选项已包含整个源树。因此,--exclude='*' 必须在 --include-from 选项之后存在,以删除 --include-from 文件中不匹配的文件。这样,将扫描整个源树,但仅包含 --include-from 文件。

另一个问题是由于源树是按自上而下的方式搜索的。所有必需的父目录也必须在 --include-from 列表中指定,否则它们将被 --exclude='*' 删除,并且不会考虑它们的子目录。

大多数手册页都过于简单,而信息页则是另一个极端,但阅读 rsync 手册页是我做过的最好的事情。Rsync 的组织非常好。

相关内容