8

我在想像我想要完成的事情可以使用内置的 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。例如:

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

2 回答 2

9

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

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

理论上-P是 的同义词--parents,但这对我来说从来没有用过。

于 2013-08-15T08:03:50.360 回答
6

您可以为此使用rsync,例如

$ 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
于 2012-04-30T22:02:06.233 回答