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

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

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

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

我正在尝试复制 src 中的所有文件来进行工作,同时保留目录结构并排除所有以 .java 结尾的文件。

这是我迄今为止的尝试:

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

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

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

答案1

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

答案2

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

答案3

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

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

将尝试保留路径(并失败,因为目录可能不存在。 - 但是你可能这样做:

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

然而,就你所做的而言,你大概想要使用 tar:

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

相关内容