シンボリックリンクを削除せずにディレクトリ構造をコピーする方法は?


27

ソースファイルのディレクトリ構造を維持したまま、別のディレクトリに多数のファイルを「インストール」する必要があります。例えば、私がしている場合./foo/bar/baz.txtに行く/var/www/localhost/webroot/、私は結果になりたいです/var/www/localhost/webroot/foo/bar/baz.txtrsyncにはこの機能が--relativeありますが、私がこれを行ったとき、シンボリックリンクに友好的ではないことがわかりました:

$ ls -ald /var/www/localhost/webroot/ | grep ^l
lrwxrwxrwx  1 www-data www-data     15 2014-01-03 13:45 media -> ../static/media
lrwxrwxrwx  1 root     root         13 2014-02-24 13:47 var -> ../static/var
$ rsync -qrR . /var/www/localhost/webroot/
$ ls -ald /var/www/localhost/webroot/ | grep var
drwxr-xr-x 3 root root 4096 2014-02-24 13:52 /var/www/localhost/webroot/var

したがって、シンボリックリンクはもはやシンボリックリンクではないことがわかります。ファイルは間違った場所にコピーされました!

rsyncまた--no-implied-dirs、表面的には私が望むことをするように見えるオプションがありますが、再帰的なrsyncを行わないときに意図したとおりに動作するだけなので、

find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/

中間のシンボリックリンクディレクトリを消去せずに(rsyncを使用して、または使用せずに)このファイルのミラーリングを実現する直接的な方法はありますか?

回答:


42

rsyncのオプション-K--keep-dirlinks)を使用します。マンページから:

 -K, --keep-dirlinks
      This  option  causes  the  receiving side  to  treat  a
      symlink  to  a  directory  as though  it  were  a  real
      directory, but only if it matches a real directory from
      the  sender.   Without   this  option,  the  receiver’s
      symlink  would  be deleted  and  replaced  with a  real
      directory.

      For example, suppose you  transfer a directory foo that
      contains a file file, but foo is a symlink to directory
      bar  on  the  receiver.  Without  --keep-dirlinks,  the
      receiver  deletes  symlink  foo,   recreates  it  as  a
      directory,  and   receives  the   file  into   the  new
      directory.   With --keep-dirlinks,  the receiver  keeps
      the symlink and file ends up in bar.

      One note  of caution:  if you  use --keep-dirlinks, you
      must  trust all  the symlinks  in the  copy!  If  it is
      possible  for an  untrusted  user to  create their  own
      symlink to  any directory,  the user  could then  (on a
      subsequent  copy)  replace  the  symlink  with  a  real
      directory and affect the  content of whatever directory
      the  symlink references.   For backup  copies, you  are
      better off using something like a bind mount instead of
      a symlink to modify your receiving hierarchy.

      See also  --copy-dirlinks for  an analogous  option for
      the sending side.

16

シンボリックリンクをシンボリックリンクとして保存したかった。そのためには、-lオプションを使用できます。

    -l, --links                 copy symlinks as symlinks

私はOS Xでフレームワークをコピーしていたので、これが役立つことがわかりました。


3

上記を想定-aしたとおり、を使用してください-l。ただし、ソースの完全なコピーが必要な場合は、他の重要なオプションも含まれています。

また、マニュアルページを理解しているように-K、受信側のシンボリックリンクを対象としています。ここでこれが正しい答えになるとは思わない。


2

rsync回答として、tarユーティリティはこのタスクを実行できます。tarパイプの両側にある2つのインスタンスを使用します。1つ目はディレクトリ構造を使用し、2つ目は別の場所に抽出します。コピーのファイル所有権は変更される可能性がありますが、許可モードは変更されない可能性があります。

多くの例が存在し、私はこの回答で提案を比較的迅速に見つけました:https : //unix.stackexchange.com/a/59108/34251


2番目の(より簡潔な?)例:https ://unix.stackexchange.com/a/19824/34251を編集します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.