Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归复制到相对目标路径_Bash_Shell - Fatal编程技术网

Bash 递归复制到相对目标路径

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

我在想,我想用内置的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
/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