rsync-排除除少数目录之外的所有目录

rsync-排除除少数目录之外的所有目录

关于此问题似乎有很多 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
  • 我发现目录已创建,但没有文件被复制到其中(无递归)。父目录中的文件被复制,但没有子目录 - 正在处理它。

这对我有用,从工作站到服务器,除了在 r​​ysnc'ing 父级 ../Inet\ Publishing 时将整个目录(包含所有站点)备份(rysnc)我的个人站点到另一台服务器(-avin 中的 'n' 是'Dry-Run',删除)。

--exclude */ 是“Inet Publishing/”中的所有其他目录,并且似乎必须按照 man rsync 进程顺序位于 --include 之后(如果在 --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

相关内容