如何通过保持目录结构完整来同步路径中具有匹配模式的文件?

How to rsync files with matching pattern in path by keeping directory structure intact?

我想将所有文件从服务器 A 复制到服务器 B,这些文件在文件系统层次结构的不同级别中具有相同的父目录名称,例如:

/var/lib/data/sub1/sub2/commonname/filetobecopied.foo
/var/lib/data/sub1/sub3/commonname/filetobecopied.foo
/var/lib/data/sub2/sub4/commonname/anotherfiletobecopied.foo
/var/lib/data/sub3/sub4/differentname/fileNOTtobecopied.foo

我想将前三个文件都在路径中包含 commonname 复制到服务器 B。我已经花了很多时间为 [=13= 找到正确的 include/exclude 模式] 但我不明白。以下命令不起作用:

rsync -a --include='**/commonname/*.foo' --exclude='*' root@1.2.3.4:/var/lib/data /var/lib/data

我匹配的文件太多或太少。如何只同步路径中带有 commonname 的文件?

我猜你正在寻找这个:

rsync -a -m --include='**/commonname/*.foo' --include='*/' --exclude='*' root@1.2.3.4:/var/lib/data /var/lib/data

您的命令有 2 个不同之处:

  • 最重要的是--include='*/'。如果没有这个,正如您指定的 --exclude='*'rsync 将永远不会进入子目录,因为所有内容都被排除在外。使用 --include='*/',子目录不再被排除,因此 rsync 可以愉快地递归。
  • 最不重要的是-m:这会删除空目录。如果没有这个,您还会复制(空)子目录 /var/lib/data/sub3/sub4/differentname/