--relative를 추가한 후 --link-dest가 하드 링크 생성을 중지하는 이유는 무엇입니까?

--relative를 추가한 후 --link-dest가 하드 링크 생성을 중지하는 이유는 무엇입니까?

첫 번째 rsync 명령이 완벽하게 작동하여 /tmp/data의 복제본을 /tmp/bak에 생성하는 이유하드 링크 사용하지만 두 번째는 복제본을 생성합니다.바이트 복사하드 링크 대신?

rsync -a    --link-dest=/tmp/data  /tmp/data/  /tmp/bak/ # HARDLINKS
rsync -a -R --link-dest=/tmp/data  /tmp/data/  /tmp/bak/ # REGULAR COPIES

테스트/재생 단계

cd /tmp/
rm -rf data bak                                                                                                                     
mkdir data bak 
echo foo > data/foo 
stat /tmp/data/foo | grep Inode
rsync -a    --link-dest=/tmp/data  /tmp/data/  /tmp/bak/
stat /tmp/bak/foo  | grep Inode                        
### Note that the inode is the same as above.

rm bak/*                       
rsync -a -R --link-dest=/tmp/data  /tmp/data/   /tmp/bak/
stat /tmp/bak/tmp/data/foo | grep Inode      
### Note that the inode is different.

답변1

-R( ) 플래그를 사용 하면 --relative모든 경로를 포함하여 모든 경로에 소스 경로가 접두어로 붙습니다 --link-dest.

귀하의 예를 통해 이 문제를 해결하려면

rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/

이는 링크 대상 경로가 가 됨을 의미합니다 /tmp/data/tmp/data. ( cp -al /tmp/data /tmp/link및 를 사용하면 이를 더 명확하게 볼 수 있습니다 strace -f rsync ... --link-dest=/tmp/link.)

이 경우 해결책은 --link-dest=/생성된 시작점이 원하는 것이 되도록 사용하는 것입니다.--link-dest=/tmp/data

rsync -a -R --link-dest=/ /tmp/data/ /tmp/bak/
stat /tmp/bak/tmp/data/foo | grep Inode    # Same inode as source, with Links: 2

답변2

이것은 흥미로운 질문입니다.

이를 사용하면 대상 디렉토리에 rsync -R복사됩니다 .tmp/data

문제는 rsync가 복사할 때 먼저 아래 제공된 디렉터리에 파일이 있는지 확인한다는 것입니다 --link-dest.

즉, /tmp/bak/*와 비교됩니다 /tmp/data/*.

문제는 rsync -R명령을 실행할 때 foo파일이 링크를 위해 /tmp/data/와 비교할 수 있는 위치에 없고 /tmp/bak/tmp/data/foorsync가 어리석게도 다음과 같은 경우에만 하드링크한다는 것입니다. 루트인 경우 주어진 디렉토리의 ( 이 예 /tmp/data에서는 /tmp/bak)

관련 정보