我想将所有文件从服务器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
我想将前三个文件都复制到服务器B的路径中commonname
。我已经花了很多时间为rsync
找到正确的包含/排除模式,但我不这样做得到它。以下命令不起作用:
rsync -a --include='**/commonname/*.foo' --exclude='*' root@1.2.3.4:/var/lib/data /var/lib/data
我要么匹配太多,要么匹配很少的文件。如何仅在路径中同步commonname
的文件?
答案 0 :(得分:33)
我想你正在寻找这个:
rsync -a -m --include='**/commonname/*.foo' --include='*/' --exclude='*' root@1.2.3.4:/var/lib/data /var/lib/data
您的命令有两个不同之处:
--include='*/'
。如果没有这个,正如您指定的--exclude='*'
,rsync
将永远不会进入子目录,因为所有内容都被排除在外。使用--include='*/'
时,不再排除子目录,因此rsync
可以愉快地递归。-m
:这会修剪空目录。如果没有这个,你也会复制(空)子目录/var/lib/data/sub3/sub4/differentname/
。