在Unix / Linux中的特定文件的recursion副本?

我需要从目录及其所有子目录复制所有*.jar文件。 我怎样才能在UNIX / Linuxterminal? 命令cp -r *.jar /destination_dir不起作用。

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

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

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

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

如果你不需要目录结构只有jar文件,你可以使用:

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

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

如果你发现有一个-exec开关,并且cp -t选项:

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

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

 find . -name "*.jar" -exec cp {} /destination_dir ";" 
 tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - ) 
 cp --parents `find -name \*.jar` destination/ 

man cp

 --parents use full source file name under DIRECTORY 

如果你想维护目的地下相同的目录层次结构,你可以使用

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

这样做,而不是扩大在back-ticks内find的输出,有能够处理任何数量的文件的优势。

 find . -name \*.jar | xargs cp -t /destination_dir 

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

 find . -name \*.jar | xargs -I FILE cp FILE /destination_dir