似乎有很多关于此的 SF 和 SO 问题,但似乎没有一个符合我的要求。
source_dir/
some_dir/
another_dir/
some_file.php
some_other_file.txt
include_this_dir/
include_that_dir/
yet_another_dir/
所以我想 rsync 其中两个目录,同时排除其余目录。我们排除除这两个目录之外的所有目录很重要,因为以后可能会有其他文件添加到 source_dir 中,并且需要在没有明确列出的情况下排除。
我试过了:
rsync -av --dry-run --delete --exclude="source_dir/*" (or just "*") --include-from="include.txt" source_dir dest_dir
我的 include.txt 有
include_this_dir/
include_that_dir/
我也尝试添加
source_dir/
没有喜悦。根本没有任何内容。
一个简单的过滤器应该可以解决问题。以适当的示例构建先前的答案-明确包括父级,以及所有(**)子文件夹和文件。然后排除其他所有内容。这是
filter.txt
:使用命令行:
会导致:
从
rsync
手册部分引用FILTER RULES
:因此,从文件中读取过滤规则并相应地对它们进行排序可能是您的最佳选择。例子:
您可以使用参数指定过滤规则文件
--filter=
。创建 --included 目录并复制其内容目录和/或文件的新命令字符串,但只有 2 个 DIRS DEEP。为什么?
这适用于我,从工作站到服务器,将我的个人站点备份(rysnc)到另一台服务器,以及在 rysnc'ing parent ../Inet\ Publishing 时包含所有站点的整个目录(-avin 中的 'n'是“试运行”,删除。)。
--exclude */ 是 'Inet Publishing/' 中的所有其他目录,并且似乎必须在 --include per man rsync process order 之后(如果在 --include 之前,则所有内容都是 --excluded 并且不再处理任何令牌,至少我是这样阅读它的,而且在实践中,当我想出这个时,我是这样理解的。)。
这实际上是我使用 cron 运行的脚本之一。*显然,目标主机可以是 IP,我在 /etc/hosts 中定义了主机并拥有 ssh 密钥对,所以我使用主机名。
rsync -avin --progress ~/MyDocuments/'Inet Publishing'/ --include='LandisTwo (2019)' --include='LandisTwo (2020) {backup}' --exclude='*/' e6420:/home /landis/Media/2TBackup/Backups/MyDocuments/ | tee -a ~/logs/Backup-InetPublishing_2020.txt