我正在编写备份脚本,但是我的脚本出现了一些问题,你能帮助我吗?
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 的组织非常好。