8

私が達成しようとしているようなことは、より複雑なスクリプトを必要とせずに組み込みのシェルツールで実行できると考えていました。

パス内のすべてのファイルを見つけて、それらが見つかった相対パスを保持する宛先ベースパスにコピーしたいと思います。

例:

私が走ったとしましょう:

[~:] 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 に答える