Bash 递归复制到相对目标路径
我在想,我想用内置的shell工具来完成一些事情,而不需要更复杂的脚本 我希望找到路径中的所有文件,并将它们复制到目标basepath,保留找到它们的相对路径 例如: 比如我跑:Bash 递归复制到相对目标路径,bash,shell,Bash,Shell,我在想,我想用内置的shell工具来完成一些事情,而不需要更复杂的脚本 我希望找到路径中的所有文件,并将它们复制到目标basepath,保留找到它们的相对路径 例如: 比如我跑: [~:] find /path/src \( -name "*.jpg" -o -name "*.gif" \) 结果是: /path/src/a.jpg /path/src/dir1/b.jpg /path/src/dir2/dir3/c.gif 我希望他们最终都能: /path/dest/a.jpg /pa
[~:] find /path/src \( -name "*.jpg" -o -name "*.gif" \)
结果是:
/path/src/a.jpg
/path/src/dir1/b.jpg
/path/src/dir2/dir3/c.gif
我希望他们最终都能:
/path/dest/a.jpg
/path/dest/dir1/b.jpg
/path/dest/dir2/dir3/c.gif
我尝试了一个-exec cp{}/path/dest\
标记为查找
,但这只是将所有内容转储到/path/dest中。例如:
/path/dest/a.jpg
/path/dest/b.jpg
/path/dest/c.gif
你可以用这个,例如
$ rsync -avm /path/src/ /path/dest/ --include \*/ --include \*.jpg --include \*.gif --exclude \*
为了澄清上述情况:
-avm # recursive, copy attributes etc, verbose, skip empty directories
/path/src/ # source
/path/dest/ # destination (NB: trailing / is important)
--include \*/ # include all directories
--include \*.jpg # include files ending .jpg
--include \*.gif # include files ending .gif
--exclude \* # exclude all other files
实际上它也适用于cp,您需要的是--parents标志
cp --parents `find /path/src \( -name "*.jpg" -o -name "*.gif" \)` /path/target
理论上,
-p
是--父母的同义词,但这对我来说从来都不起作用。属于。find有能力处理这种情况吗?你可能可以用find
来做,但它似乎会更费力,更容易出错,因此,rsync
对于这个特定的工作来说可能是一个更好的工具。@PaulR它根本不起作用-我只是创建了一个xcode项目,将这个脚本放到它的目录中,然后运行:rsync-av。结果/--包括\*.strings--排除\*
。零文件@VyachaslavGerchicov:您遗漏了——include\*/
。另外,当在Xcode下运行脚本时,您对当前工作目录做出了(可能不正确)的假设。@PaulR如果我添加了这个,那么它将包括所有子文件夹,但会使它们为空。应该有--prune empty dirs
,但您没有提到它。所以这不是一个答案你的答案是正确的:——父母是正确的答案。但是,-P
是错误的(它的意思是:永远不要遵循源代码中的符号链接
,它是的同义词——不取消引用
注意:--父级
是POSIX的GNU扩展。@CiroSantilli说得很好。但是,你知道有多少系统是在GNU或GNU约定之上积极使用的吗?@rioki,我知道这样的系统;OS X