如何将一棵树中的所有文件复制到另一棵树,除了匹配模式?

我在./src/下有一个目录树

我在./work/下有另一个匹配的目录树

我试图复制src中的所有文件来工作,同时保持目录结构,并排除以.java结尾的所有文件。

这是我迄今为止的尝试:

find src -type f ! -iname *.java -exec cp {} work \; 

这几乎可以工作,但是所有的文件都被放到工作的顶层,而不是放到目录树的正确位置。

我怎样才能做到这一点? (在Mac OS X 10.9上使用bash

tar cCf /source/path - --exclude "*.java" . | tar xCf /target/path -

 rsync -a --exclude='*.java' src/ work/ 

您可以多次使用{} 。 所以:

 find src -type f ! -iname '*.java' -exec cp {} work/{} \; 

将尝试和保存path(并失败,因为该目录可能不存在 – 但你可能可以这样做:

 -exec mkdir -p `dirname {}` \; 

但是,对于你在做什么,你可能想要使用焦油:

 find src -type f ! -iname '*.java' | xargs tar cvf - | ( cd work && tar xvf - )