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