첫 번째 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/foo
rsync가 어리석게도 다음과 같은 경우에만 하드링크한다는 것입니다. 루트인 경우 주어진 디렉토리의 ( 이 예 /tmp/data
에서는 /tmp/bak
)