使用构建的目录结构
#!/bin/bash
for name in A B
do
mkdir -p /tmp/src/${name}/copyme
echo "do not copy" > /tmp/src/${name}/no.txt
echo "copy" > /tmp/src/${name}/copyme/yes.txt
done
我只想将copyme
目录以及其中的文件镜像到 /tmp/tgt。
这应该很简单。依靠rsync
区分命令行选项的顺序:排除一切,然后包含相关模式。然而
rsync -av --exclude='*' --include='copyme' /tmp/src/ /tmp/tgt/
排除所有内容(仅创建目标目录)。为什么?
运行时
rsync
,它会根据模式测试源中找到的名称,并且第一个匹配模式生效:当一个目录被排除时(参见上面的“隐藏目录...”),它的内容不会被进一步考虑。颠倒排除和包含模式将无济于事,因为它永远不会到达
copyme
目录。rsync
手册说:所以与其:
请注意,排除必须排在最后,在包含之后。该
copyme/***
模式匹配copyme
目录名本身和它下面的任何路径名。如果您不想硬编码
A
和B
目录名称:这将输出
结果将是
另一种不使用排除或包含模式
rsync
但用于find
定位copyme
目录然后rsync
复制它们的方法:注意这里使用的
-R
(--relative
) 标志rsync
。sh -c
为每个找到copyme
的目录执行的脚本执行一个cd
to/tmp/src
,然后复制路径名,并/tmp/src
删除其路径的初始位。-prune
infind
命令停止在找到的目录中find
查找更多copyme
目录。