Unix / Linux中特定文件的递归副本?

时间:2012-03-08 18:32:21

标签: linux bash shell unix cp

我需要从目录及其所有子目录中复制所有*.jar个文件。我怎么能在UNIX / Linux终端上做到这一点?命令cp -r *.jar /destination_dir不起作用。

7 个答案:

答案 0 :(得分:90)

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

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

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

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

答案 1 :(得分:34)

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

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

如果您需要目录结构,可以查看cp的{​​{1}}选项。

答案 2 :(得分:17)

如果你的find有-exec开关,那么cp和-t选项:

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

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

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

答案 3 :(得分:4)

tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - )

答案 4 :(得分:4)

cp --parents `find -name \*.jar` destination/

来自man cp

--parents
       use full source file name under DIRECTORY

答案 5 :(得分:2)

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

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

这种方式,而不是在后面的标记内扩展find的输出,具有能够处理任意数量的文件的优势。

答案 6 :(得分:1)

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

假设您的jar文件名不包含空格,并且cp具有“-t”选项。如果cp无法执行“-t”

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