심볼릭 링크를 제거하지 않고 디렉토리 구조를 복사하는 방법은 무엇입니까?


27

소스 파일의 디렉토리 구조를 그대로 유지하면서 다른 디렉토리에 많은 파일을 "설치"해야합니다. 예를 들어, 내가 한 경우 ./foo/bar/baz.txt에 가고 /var/www/localhost/webroot/나는 결과가되고 싶어요 /var/www/localhost/webroot/foo/bar/baz.txt. rsync에이 기능이 --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가 있거나없는 중간 symlink 디렉토리를 지우지 않고이 파일 미러링을 수행하는 더 직접적인 방법이 있습니까?

답변:


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파이프의 양쪽에 두 개의 인스턴스를 사용하십시오 . 첫 번째는 디렉토리 구조를 사용하고 두 번째는 다른 위치에서 추출합니다. 사본의 파일 소유권은 변경 될 수 있지만 권한 모드는 변경되지 않을 가능성이 있습니다.

많은 예가 존재 하며이 답변의 제안이 비교적 빠르게 발견되었습니다 : /unix//a/59108/34251 .

/unix//a/19824/34251과
같이 두 번째 (더 간결한?) 예를 편집 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.