리눅스 / rsync / 동기화 프로그램

rsync는 파일과 디렉터리를 로컬 또는 원격 시스템으로 복사하고 변경 사항을 반영하는 도구입니다. 기본 동작은 원본에서 대상으로 한 방향으로 복사하며, 대상에서만 존재하는 파일은 --delete를 지정하지 않으면 삭제하지 않습니다.

시작하기 전에

예제는 Linux 셸에서 실행합니다. 먼저 rsync --version으로 설치 여부를 확인하세요. Ubuntu에서는 설치되어 있지 않다면 다음 명령으로 설치할 수 있습니다. 원격 전송에는 양쪽 시스템에 rsync가 필요하며, SSH(Secure Shell)를 사용할 경우 원격 접속과 대상 경로의 쓰기 권한도 필요합니다.

sudo apt update
sudo apt install rsync

원본과 대상 경로를 반대로 입력하면 원하는 데이터를 덮어쓰거나 삭제할 수 있습니다. 중요한 데이터를 다루기 전에는 별도의 백업을 확보하고, 특히 삭제 옵션을 사용할 때는 --dry-run으로 예상 변경을 먼저 확인하세요. 동기화는 원본의 실수나 손상도 대상에 반영할 수 있으므로 이전 시점을 복원하는 백업과는 다릅니다.

로컬 디렉터리 복사와 슬래시 차이

다음은 홈 디렉터리 아래에 새 실습 폴더를 만들고 파일 하나를 준비하는 예입니다. 같은 이름의 기존 폴더가 있다면 다른 이름을 사용하세요.

mkdir -p "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest"
printf 'hello\n' > "$HOME/rsync-demo/source/hello.txt"
rsync -av "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
ls -l "$HOME/rsync-demo/dest/"

마지막 명령의 결과에 hello.txt가 있으면 원본 디렉터리의 내용이 대상 안에 복사된 것입니다. 같은 rsync 명령을 다시 실행하면 변경되지 않은 일반 파일은 보통 다시 전송되지 않습니다. 기본 비교는 파일 크기와 수정 시간을 사용하므로 내용이 같다는 완전한 검증은 아닙니다.

원본 끝의 /는 디렉터리 자체가 아니라 그 안의 내용을 대상에 복사한다는 뜻입니다. 대상 디렉터리가 이미 있을 때 슬래시를 빼면 원본 디렉터리 이름이 대상 아래에 생깁니다.

rsync -av "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest/"

이 명령을 실행하면 dest/source/hello.txt가 생깁니다. 앞서 만든 dest/hello.txt도 그대로 남습니다. 두 경로의 차이는 삭제 옵션을 사용할 때 특히 중요합니다. 경로에 공백이 있으면 예제처럼 따옴표로 감싸세요.

자주 쓰는 옵션과 사전 점검

  • -a: 아카이브 모드입니다. 재귀 복사와 시간·권한·소유자·그룹·심볼릭 링크 등의 보존을 요청합니다. 소유권 보존은 권한과 대상 파일 시스템의 지원에 따라 제한될 수 있습니다. ACL과 확장 속성은 -a에 포함되지 않습니다.
  • -v: 처리 내용을 자세히 출력합니다.
  • -n 또는 --dry-run: 실제로 변경하지 않고 예상 작업을 보여 줍니다.
  • -z: 전송 중 압축을 사용합니다. 네트워크 상황과 파일 종류에 따라 효과가 다르며 로컬 복사에 항상 필요한 것은 아닙니다.

예를 들어 실제 복사 전에 다음과 같이 확인할 수 있습니다. 출력은 예상 변경 사항이며, 시험과 실제 실행 사이에 파일이 바뀌거나 오류가 나면 실제 결과도 달라질 수 있습니다.

rsync -avn "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

대용량 파일을 다루거나 크기·수정 시간이 같은데 내용이 다른지 확인해야 한다면 --checksum 비교를 검토할 수 있지만, 양쪽 파일을 읽으므로 비용이 커질 수 있습니다. 옵션의 자세한 뜻은 rsync 공식 매뉴얼을 참고하세요.

대상에서만 존재하는 파일 삭제하기

--delete는 동기화 대상 디렉터리에서 원본에 없는 항목을 삭제합니다. 실수로 다른 대상이나 잘못된 디렉터리 수준을 지정하면 필요한 파일도 삭제될 수 있으므로 먼저 대상 경로와 원본의 끝 슬래시를 확인하고 시험 실행 결과를 검토하세요.

다음 예는 위에서 만든 dest/source/ 같은 대상 전용 항목도 삭제 대상으로 표시할 수 있습니다. 실습 폴더에 보관할 파일이 없을 때만 실행하세요.

rsync -avn --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

출력의 deleting 항목을 확인하고, 삭제 범위가 정확하며 복구할 백업이 준비된 경우에만 -n을 빼서 실제로 실행합니다.

rsync -av --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

이 명령은 대상만 변경하며 원본에서 파일을 삭제하지 않습니다. 대상에서만 존재하던 파일은 일반적인 파일 복구 절차 없이 되돌릴 수 없을 수 있습니다. 운영 데이터에는 별도의 버전 백업과 복원 검증을 준비하세요.

파일이나 디렉터리 제외하기

원본의 cache 디렉터리를 전송 대상에서 제외하려면 다음과 같이 지정합니다. 원본의 내용이 전송 루트이므로 앞의 슬래시는 그 루트의 cache를 가리킵니다. 먼저 시험 실행하여 원하는 항목만 제외되는지 확인하세요.

rsync -avn --exclude='/cache/' "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

결과가 맞으면 -n을 빼서 복사합니다. 기본 제외 규칙은 일반적인 --delete에서 대상의 제외 항목을 보호하지만, --delete-excluded를 사용하거나 필터 규칙을 바꾸면 동작이 달라질 수 있습니다. 복잡한 패턴은 실제 데이터에 적용하기 전에 별도 폴더에서 확인하세요.

SSH로 원격 서버와 동기화하기

SSH 접속이 준비된 환경에서 아래 명령은 로컬 원본의 내용을 원격 서버의 대상 디렉터리로 보냅니다. user, server.example.com, 경로는 실제 값으로 바꾸고, 원격 대상 디렉터리를 미리 준비하세요. 처음 연결할 때는 서버의 호스트 키 지문을 신뢰할 수 있는 경로로 확인합니다.

rsync -avn -e ssh "$HOME/rsync-demo/source/" user@server.example.com:/home/user/backup/

예상 전송 목록을 검토한 뒤 -n을 빼면 전송합니다. 반대로 원격 서버에서 로컬로 가져오려면 원격 경로를 원본 위치에 둡니다.

rsync -avn -e ssh user@server.example.com:/home/user/backup/ "$HOME/rsync-demo/dest/"

SSH 포트가 기본값과 다르면 예를 들어 -e 'ssh -p 2222'를 사용합니다. 원격 접속은 권한이 제한된 계정과 SSH 키 인증을 사용하는 것이 좋습니다. 비밀번호를 명령에 직접 적으면 프로세스 정보나 셸 기록 등에 노출될 수 있으므로 기존 글의 sshpass -p 예제는 사용하지 않습니다. 자동 작업에서는 키의 보호와 접근 범위도 함께 관리하세요.