경로의 심볼릭 링크를 사용한 rsync [닫기]

경로의 심볼릭 링크를 사용한 rsync [닫기]

디렉토리에 다음과 같은 경로가 있다고 가정해 보겠습니다.

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

관련 정보