66

我需要*.jar从目录及其所有子目录中复制所有文件。如何在 UNIX/Linux 终端中执行此操作?命令cp -r *.jar /destination_dir不起作用。

4

7 回答 7

106

rsync对于本地文件复制以及机器之间的复制很有用。这将做你想要的:

rsync -avm --include='*.jar' -f 'hide,! */' . /destination_dir

整个目录结构来自 . 复制到 /destination_dir,但仅复制 .jar 文件。-a 确保文件的所有权限和时间都不变。-m 将省略空目录。-v 用于详细输出。

对于试运行添加一个-n,它会告诉你它会做什么,但实际上不会复制任何东西。

于 2012-03-08T22:48:02.643 回答
39

如果您只需要 jar 文件的目录结构,则可以使用:

shopt -s globstar
cp **/*.jar destination_dir

如果你想要目录结构,你可以检查cp's--parents选项。

于 2012-03-09T09:49:50.147 回答
18

如果您的 find 有 -exec 开关,并且 cp 有 -t 选项:

find . -name "*.jar" -exec cp -t /destination_dir {} +

如果您发现没有提供“+”进行并行调用,您可以使用“;” 但是你可以省略-t

find . -name "*.jar" -exec cp {} /destination_dir ";"
于 2012-03-08T19:41:41.147 回答
7
cp --parents `find -name \*.jar` destination/

来自man cp

--parents
       use full source file name under DIRECTORY
于 2012-03-08T19:16:17.397 回答
4
tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - )
于 2012-03-08T18:38:06.953 回答
3

如果要在目标下维护相同的目录层次结构,可以使用

(cd SOURCE && find . -type f -name \*.jar -exec tar cf - {} +) \
  | (cd DESTINATION && tar xf -)

这样做的方式,而不是扩展find内反引号的输出,具有能够处理任意数量的文件的优点。

于 2012-03-08T19:43:31.030 回答
2
find . -name \*.jar | xargs cp -t /destination_dir

假设您的 jar 文件名不包含空格,并且您cp有“-t”选项。如果cp不能做“-t”

find . -name \*.jar | xargs -I FILE cp FILE /destination_dir
于 2012-03-08T18:43:19.283 回答