rsync를 사용하여 디렉토리 트리를 복제하여 파일에 대한 하드 링크를 만들려면 어떻게해야합니까?


23

때때로, 나는 서버의 데이터 파일에 대해 몇 가지 큰 마이그레이션 변경을 수행해야하며,이를위한 좋은 방법을 찾고 있습니다. rsync를 사용하여 루트 데이터 폴더에서 시작하여 디렉토리 구조를 복제하고 모든 원본 파일에 대한 하드 링크를 만들려고 생각했습니다 (일부는 다소 큼). 대상 트리에서 마이그레이션 해야하는 파일 만 덮어 쓸 수 있습니다. 결국 두 가지 mv작업으로 이전 파일에서 새 파일로 안전하게 전환 할 수 있습니다 .

그러나 rsync를 사용 하여이 작업을 수행 할 수 없습니다. 나는 시도했다

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

그러나 rsync는 파일에 대한 하드 링크를 만드는 대신 완전히 복사합니다. 동일한 소스 및 링크 대상 디렉토리를 사용하는 데 문제가 있습니까?

답변:


21

rsync 강력한 도구이지만 불행히도 일부 경로 이름에 대해 이상하게 까다 롭습니다.

경우 $DATA(그것이 시작 즉, 절대 경로이며 /) 후 사용할 올바른 명령 라인은 :

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[이제, rsync이상한 점 에 대해 간단히 설명 해주세요. 후행 /이 소스 인수에 추가되었습니다. 소스 디렉토리 자체가 아닌 소스 디렉토리 rsync내용 으로 작업하도록 지시 합니다. (이것 $DATA에는 아직 후행이 포함되어 있지 않다고 가정합니다 /.)이 경우 내용으로 작업하고 싶으므로 후행을 추가합니다 /.]

반면 $DATA에 상대 경로 인 경우 (즉 /,로 시작하지 않는 경우 ) Sean R의 의견은 다음 --link-dest과 같습니다. 링크 대상 경로 는 대상 경로를 기준으로 해석 되므로 다음을 사용합니다.

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

편집하다

마지막으로, rsync내가 준 두 번째 명령 줄 $DATA은 절대 경로 인지 여부에 관계없이 작동해야 basename합니다. 경로가 절대 경로인지 상대 경로인지 상관하지 않기 때문 입니다.


1
그 생각을했을 줄 모르는 슬래시… 좋은 설명 감사합니다!
Jean-Philippe Pellet

내가 좋아하는 몇 가지 증분 백업 지침에 따라 시도,이 주셔서 감사합니다 ,이 일 이 특질에 대한 언급을 찾을 수 없습니다. 이것은 실제로 파일이 하드 링크되어 있는지 확인한 유일한 것입니다. 참조 횟수가 1보다 크거나 inode 수가 같은지 확인ls -ilah
Walf

나는 이것을 unix.stackexchange.com/a/85068/57414 에 설명 된 relpath () 함수와 함께 사용 하여 $SOURCE디렉토리를 다음 $TARGET과 같은 디렉토리에 백업했습니다 :SOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
Nathan S. Watson-Haigh

13

원하는 것은 "cp -al"입니다.

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -처럼 되풀이 rsync -a
  • -l은 파일을 복사하는 대신 하드 링크합니다.

1
cp -al불행히도 내 시스템 (Mac OS X 10.6)에서 사용할 수 없습니다. 대신 pax를 사용하겠습니다 ...
Jean-Philippe Pellet

7

--link-dest의 옵션을 rsync받는 상대적인 대상 디렉토리가 아닌 현재 디렉토리. 그래서 당신이 원하는 것은 :

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

죄송합니다. 기본 이름은 원래 dirname이었습니다.
Sean Reifschneider

1
남자 페이지는 말한다 --link-dest옵션이 상대적 경우 , 대상 디렉토리를 기준으로합니다. 제 경우에는 절대적입니다. 대상 디렉토리에 상대적으로 만들더라도 이것이 작동하지 않습니다.
Jean-Philippe Pellet

7

rsync다른 도구 보다이 작업을 수행하는 것이 더 어렵다는 것이 밝혀졌습니다 . 에 대한 정답은 rsync스티븐 Monai의,하지만이 작업을 수행하는 가장 쉬운 방법 중 하나를 사용하는 것 cp -al또는 pax -rwl어디에 시스템에 -l대해 유효한 옵션이 아닙니다 cp:

pax -rwl $DATA $DATA/../upgrade_tmp

또는

cp -al $DATA/ $DATA/../upgrade_tmp/

4

그것은 나를 위해 작동합니다 :

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

rsync 버전 3.1.0을 사용합니다.

에서 사람 :

-하드 링크

이 옵션없이 전송에서 하드 링크 된 파일을 찾도록 rsync에 지시합니다.이 옵션이 없으면 전송에서 하드 링크 된 파일은 별도의 파일 인 것처럼 처리됩니다.

--link-dest = DIR

변경되지 않은 파일은 DIR에서 대상 디렉토리로 하드 링크됩니다. 파일을 서로 연결하려면 보존 된 모든 속성 (예 : 권한, 소유권)에서 파일이 동일해야합니다.


2
코드 스 니펫만으로는 충분하지 않습니다. 코드 스 니펫의 기능과 이유를 설명하십시오.
peterh는 모니카 복원 복원

--hard-links 이 옵션을 사용하지 않으면 rsync가 전송에서 하드 링크 된 파일을 찾도록 지시합니다.이 옵션이 없으면 전송에서 하드 링크 된 파일은 별도의 파일 인 것처럼 처리됩니다. --link-dest = DIR 변경되지 않은 파일은 DIR에서 대상 디렉토리로 하드 링크됩니다. 파일을 서로 연결하려면 보존 된 모든 속성 (예 : 권한, 소유권)에서 파일이 동일해야합니다.
Alexander Fedorov

1
훌륭한. 고맙습니다. 실제로 "저품질"대기열에서 귀하의 답변을 찾았습니다. 답변을 삭제해야하는지 여부에 대한 투표가있었습니다. 그러나 삭제의 위험은 올바른 형식의 "인간적인"답변을 제공하려는 이유 일뿐 아니라 공감대를 수집하려는 경우 많은 도움이됩니다.
peterh는 Monica Monica를


2

먼저 대상에서만 디렉토리를 작성하십시오.

rsync -av --include '*/' --exclude '*' /source/ /destination/

그런 다음 파일 만 하드 링크하십시오.

cd /source
find . -type f -exec ln -v {} /destination/{} \;

감사합니다. 실제로 pax위의 설명과 같이 잘 사용할 수 있습니다.
Jean-Philippe Pellet

1

옵션 -H를 사용하여 하드 링크를 유지하고 맨 페이지를 읽으십시오.


1
-H가 작동하지 않습니다. 소스 트리에 보존 할 하드 링크가 없습니다. 사본의 모든 파일이 원본 파일에 하드 링크 된 소스 트리의 간단한 사본을 원합니다. 내 원래 질문에 죄송합니다 ...
Jean-Philippe Pellet

"맨 페이지 읽기"가 답입니까? :-)
meduz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.