递归复制到相对目标路径

时间:2012-04-30 22:00:13

标签: bash shell

我在思考类似于我想要完成的事情,可以使用内置的shell工具来完成,而不需要更复杂的脚本。

我想查找路径中的所有文件并将它们复制到目标基路径,保留它们所在的相对路径。

示例:

说我跑了:

[~:] 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 \;尝试了一个find标志,但这只是将所有内容转储到/ path / dest中。 E.g:

/path/dest/a.jpg
/path/dest/b.jpg
/path/dest/c.gif

2 个答案:

答案 0 :(得分:9)

实际上它也适用于cp,你想要的是--parents flag。

cp --parents `find /path/src  \( -name "*.jpg" -o -name "*.gif" \)` /path/target

理论上-P--parents的同义词,但这对我来说无效。

答案 1 :(得分:6)

您可以使用rsync,例如

$ rsync -av /path/src/ /path/dest/ --include \*/ --include \*.jpg --include \*.gif --exclude \*

只是为了澄清以上内容:

-av              # recursive, copy attributes etc, verbose
/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
相关问题