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

Yur*_*yak 60 unix linux bash shell cp

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

Sea*_*ean 91

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

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

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

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

  • 当然.-f表示它是一个过滤规则(--filter的缩写).规则说隐藏所有非目录,即文件.'\*/'模式匹配一​​个目录,然后是!否定它意味着任何不是目录的东西(所以,文件).'--include =*.jar'优先于过滤器,因此包含.jar文件(仅限). (6认同)
  • 你介意给我解释一下这个部分:`-f'隐藏,!*/'`?在此先感谢您的帮助! (3认同)

uzs*_*olt 34

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

shopt -s globstar
cp **/*.jar destination_dir
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你指出` - parent`选项.它与海报要求略有不同:它创建了目录结构*,只要文件需要复制*,而不是整个目录结构. - 正是我*需要的!:-) (4认同)
  • 对于shopt globstar +1,我不知道其中任何一个,有用. (2认同)
  • `cp -rf --parents destination_dir`完美无缺 (2认同)

use*_*own 17

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

find . -name "*.jar" -exec cp -t /destination_dir {} +
Run Code Online (Sandbox Code Playgroud)

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

find . -name "*.jar" -exec cp {} /destination_dir ";"
Run Code Online (Sandbox Code Playgroud)


Bar*_*ski 6

cp --parents `find -name \*.jar` destination/
Run Code Online (Sandbox Code Playgroud)

来自man cp

--parents
       use full source file name under DIRECTORY
Run Code Online (Sandbox Code Playgroud)