关于此问题似乎有很多 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/
毫无乐趣。什么都没有包括。
答案1
一个简单的过滤器就可以解决问题。以前面的答案为基础,举一个合适的例子——明确包括父级,以及所有(**)子文件夹和文件。然后排除其他所有内容。以下是filter.txt
:
+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /**
使用命令行:
rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/
会导致:
sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/
sent 202 bytes received 65 bytes 534.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
答案2
引用rsync
手册部分FILTER RULES
:
[...] 对第一个匹配的模式进行操作:如果它是一个排除模式,那么就会跳过该文件;如果它是一个包含模式,那么就不会跳过该文件名;如果找不到匹配的模式,那么就不会跳过该文件名。
因此,从文件中读取过滤规则并进行相应排序可能是您的最佳选择。例如:
CW+ source_dir/include_this_dir/
CW+ source_dir/include_that_dir/
CW- source_dir/
您可以使用参数指定过滤规则文件--filter=
。
答案3
新的命令字符串创建 --included 目录并复制其内容目录和/或文件,但深度只有 2 个目录。为什么?
rsync -avid --progress ~/MyDocuments/'Inet Publishing'/ --recursive --include='LandisTwo (2019)' --include='LandisTwo (2020) {backup}' --include='*.*' --exclude='**/' e6420:/home/landis/Media/2TBackup/Backups/MyDocuments/"Inet\ Publishing"/ | tee -a ~/logs/Backup-InetPublishing_2020.txt
- 我发现目录已创建,但没有文件被复制到其中(无递归)。父目录中的文件被复制,但没有子目录 - 正在处理它。
这对我有用,从工作站到服务器,除了在 rysnc'ing 父级 ../Inet\ Publishing 时将整个目录(包含所有站点)备份(rysnc)我的个人站点到另一台服务器(-avin 中的 'n' 是'Dry-Run',删除)。
--exclude */ 是“Inet Publishing/”中的所有其他目录,并且似乎必须按照 man rsync 进程顺序位于 --include 之后(如果在 --include 之前,则所有内容都被 --excluded 并且不再处理任何标记,至少在我读到它并且在实践中想出这个方法时是如此)。
这实际上是我使用 cron 运行的脚本之一中的一行。*显然,目标主机可以是 IP,我在 /etc/hosts 中定义了主机,并且有 ssh 密钥对,,,所以我使用主机名。