在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