
디렉토리에 다음과 같은 경로가 있다고 가정해 보겠습니다.
a/b/c/d/e
c
실제로 심볼릭 링크는 어디에 있습니까?
a/b/c -> f
그리고 .f
d/e
rsync -avzR
그런 다음 플래그 없이 를 실행하면 --copy-unsafe-links
이 "안전하지 않은" 링크가 계속 복사됩니다.
예상되는:
a/b/c->f
f/d/e
내가 달릴 때 rsync -avzR a/b/c/d/e some_dir
.
실제 출력:
a/b/c/d/e
이런 식으로 어떻게 예상 출력을 얻을 수 있습니까?
답변1
당man rsync
(내 강조점):
-R, --상대적
상대 경로를 사용하십시오. 이는 파일 이름의 마지막 부분이 아닌 명령줄에 지정된 전체 경로 이름이 서버로 전송된다는 의미입니다. [만약] 당신이 사용했다면
rsync -avR /foo/bar/baz.c remote:/tmp/
그러면 /tmp/foo/bar/baz.c라는 파일이 전체 경로를 유지하면서 원격 시스템에 생성됩니다. 이러한 추가 경로 요소를 호출합니다."암시된 디렉토리"(즉, 위 예의 "foo" 및 "foo/bar" 디렉토리).
rsync 3.0.0부터,rsync는 경로 요소가 실제로 전송 측의 심볼릭 링크인 경우에도 항상 이러한 암시적 디렉터리를 파일 목록의 실제 디렉터리로 보냅니다. 이렇게 하면 경로에 심볼릭 링크가 있다는 것을 인식하지 못한 파일의 전체 경로를 복사할 때 실제로 예상치 못한 동작이 발생하는 것을 방지할 수 있습니다. 서버측 심볼릭 링크를 복제하려면 해당 경로를 통해 심볼릭 링크를 포함하고 실제 경로를 통해 참조 디렉터리를 모두 포함합니다. 전송 측에서 이전 rsync를 처리하는 경우 이 옵션을 사용해야 할 수도 있습니다
--no-implied-dirs
.
따라서 귀하가 경험한 동작이 예상됩니다.
이것을 극복하는 방법은 무엇입니까? 나는 이것을 테스트하지는 않았지만 실행 가능한 해결 방법은 다음과 같을 것이라고 생각합니다.
mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir # No trailing slash after 'f'
나는 또한 다음을 읽는 것이 좋습니다.기호 링크매뉴얼 페이지 섹션 rsync
.
답변2
나는 당신의 행동을 흉내낼 수 없습니다. 디렉터리를 설정한 다음 복사하는 스크립트를 만들었습니다. 내부에는 상대 심볼릭 링크와 절대 심볼릭 링크가 있습니다. 표시되는 옵션( -avzR
)을 사용하면 둘 중 하나로 내려가지 않고 링크를 링크로 복사해야 합니다.
나는 당신이 시도하는 것의 일부 측면을 잘못 해석했다고 가정합니다. 따라서 그것이 무엇인지 찾으면 질문에 추가할 수 있습니다. 또는 이 스크립트를 실행하여 귀하의 행동이 제가 보여주는 것과 다른지 확인할 수 있습니다.
스크립트:
#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST
산출
sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f
그리고 대상은 내부의 심볼릭 링크로 생성됩니다.
$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f