여기에는 다양한 유사한 질문이 있지만 그 중 어느 것도 이 질문에 완전히 대답하지 못하는 것 같습니다.
원격 서버에 정확하게 미러링되어야 하는 로컬 디렉터리( )가 있는데 www
, 이 디렉터리가 정확한 복사본인지 확인해야 합니다.
www
내부의 다른 파일에 대한 심볼릭 링크를 포함합니다 www
(일반 파일 및 디렉터리에 대한 링크). 이 명령은 보너스로 로컬 svn 디렉토리를 제외하고 두 버전을 비교 www
하고 다른 파일만 인쇄합니다.
[local]$ rsync -rvnc --exclude=.svn/ --delete www/ remote:/var/www/
하지만심볼릭 링크를 따르지 않고 일반 파일이 아니라고 보고할 뿐입니다. 따라서 심볼릭 링크를 역참조하고 해당 대상을 비교해야 합니다. 이것도 작동하지 않습니다. rsync -rvncL
다르지 않은(어차피 볼 수 있는) 많은 파일을 인쇄하고 아무 작업도 수행하지 않습니다. 어떤 아이디어가 있나요?rsync -rvncK
-L
-K
답변1
심볼릭 링크와 함께 일반 명령을 사용하는 것은 까다롭습니다. find
명령이 문제를 잘 처리합니다. 따라서 핵심은 를 사용하는 것입니다 find
. 필요에 따라 빠른 CRC 또는 암호화 해시 기능을 권장합니다.
따라서 이와 같은 것이 작동해야 합니다(필요에 따라 보충할 수 있습니다).
find -L www -type f -exec cksum {} \; | cut -d ' ' -f1-2 | md5sum
체크섬에 대한 암호화 지원을 원하는 경우
find -L www -type f -exec sha256sum {} \; | cut -d ' ' -f1 | sha256sum
sha256은 파일 및 디렉터리 오류에 대해서만 작동하고 컷은 체크섬/해시를 최종 함수에 전달하고 실제로 경로 이름만 다른 경우 거짓 긍정을 방지하는 데만 사용되므로 "유형" 식별자가 필요합니다.
참고: 심볼릭 링크가 상대적이지 않고 두 시스템의 경로가 정확히 동일하지 않은 경우(심볼릭 링크가 실행 중인 디렉터리 외부를 가리키는 경우 발생할 수 있음) 이 작업은 실패합니다 find
.
답변2
rsync
자세한 내용은 링크를 따라가거나 링크 자체를 복사하는 옵션을 사용하는 것이 해결책이라고 생각합니다 .
--links, -l copy symlinks as symlinks
이 옵션은 일반 "--archive" 옵션에도 포함되어 있습니다.
--archive, -a archive mode is -rlptgoD (no -A,-X,-U,-N,-H)
참고로 내 예에서는 rsync를 사용할 때 일반적으로 "-Pav"를 사용합니다.
$ rsync -Pav SOURCE DEST
최소한 이 옵션은 CentOS Stream 9(rsync 3.2.3) 및 Ubuntu 22.04(3.2.7)에서 사용할 수 있습니다.