我想将所有文件“pom.xml”从大树复制到新树:在 src 树的每一层我都有这个文件。我想获得相同的树结构,但忽略空目录。
听起来像 rsync 单行代码,但我不明白... :-/
提前致谢 ...
答案1
你可以通过例如
rsync -rvm --include='*/' --filter='-! pom.xml' SOURCE DEST
-r
递归,-v
详细打印发生了什么,-m
修剪空目录(传输后不包含任何内容的目录),--include='*/'
告诉rsync
明确包含目录本身,否则下一个过滤器会将其修剪掉(这是一个我被困了可耻次数的警告:目录明确地在这种情况下需要允许),--filter='-! pom.xml'
排除以下文件不是(这就是“!
”所做的)与模式匹配(这也会包括没有--include
上述模式的所有目录)。
正如我所说的,我已经多次思考过 rsync 复杂过滤规则中目录的行为,也许手册中已经说得很清楚了,但在这种情况下,我很长时间都没有注意到它,因此,如果能得到澄清,我将不胜感激。
答案2
从树的根文件夹:
find . -name pom.xml | rsync -ax --files-from=- . /destination/tree/
rsync 无法“排除除此以外的所有内容”,因此我们首先找到文件,然后files-from
通过标准输入(-
)将它们输入到列表中。-a
表示存档,递归和权限保留也是如此。 表示-x
“不遍历文件系统”,我倾向于出于习惯而将其包括在内,并在我确定要遍历文件系统时将其删除。