rsync:复制树每层仅包含一个文件

rsync:复制树每层仅包含一个文件

我想将所有文件“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“不遍历文件系统”,我倾向于出于习惯而将其包括在内,并在我确定要遍历文件系统时将其删除。

相关内容