파일 및 디렉터리 동기화를 위한 rsync 명령 사용법 [11 Examples]

rsync: 파일 동기화 및 전송을 위한 강력한 도구

rsync는 로컬 및 원격으로 파일을 동기화할 수 있는 무료 명령줄 유틸리티입니다. 이 도구를 사용하여 파일과 디렉터리를 효율적으로 전송할 수 있습니다.

데이터 마이그레이션, 백업, 미러링 작업에 매우 유용하며, 특히 웹마스터와 시스템 관리자가 반복적인 데이터 전송 작업을 처리하는 데 효과적입니다.

본 문서에서는 rsync의 작동 원리를 상세히 설명하고, 실제 사용 사례를 통해 rsync를 효과적으로 활용하는 방법을 안내합니다.

rsync의 작동 방식

rsync는 Unix 계열 시스템을 위한 원격 동기화 명령줄 도구로, 사용자가 시스템 내부 또는 서로 다른 호스트 간에 파일을 원활하게 전송하고 동기화할 수 있도록 지원합니다.

rsync는 델타 전송 알고리즘을 핵심으로 사용합니다. 이 알고리즘은 두 호스트(소스와 대상) 간 파일의 차이점만을 복사함으로써 전송 효율성을 극대화합니다. 소스와 대상은 로컬 시스템 또는 원격 시스템일 수 있습니다. rsync는 다음 두 가지 주요 방식으로 데이터 복사 및 동기화를 수행합니다.

  • SSH 또는 RSH를 사용하여 두 호스트 간에 데이터 복사/동기화
  • TCP rsync 데몬을 사용하여 복사/동기화

Unix 계열 시스템을 기반으로 설계되었기 때문에 Linux 환경에서도 원활하게 작동합니다.

rsync가 데이터를 처리하는 단계별 과정은 다음과 같습니다.

  • rsync는 SSH를 통해 원격 호스트에 안전하게 연결하고 필요한 경우 암호를 요청합니다.
  • 연결이 성공적으로 설정되면 원격 호스트의 rsync 프로그램과 통신을 시작합니다.
  • 이후 동기화가 필요한 파일과 디렉터리를 판단하며, 델타 전송 알고리즘을 활용하여 파일 간의 차이를 분석합니다.

만약 rsync 명령이 원격 시스템에서는 찾을 수 없는 파일을 로컬 호스트에서 발견하면, 해당 파일을 복사하여 호스트 시스템으로 전송합니다. 기존 파일의 경우에는 변경된 부분만 복사하며, 변경 사항이 없는 파일은 무시합니다.

rsync는 증분 업데이트를 수행하기 위해 임시 파일에 변경 사항을 저장한 후 대상 시스템으로 전송합니다.

rsync 사용을 시작하기 전에 다음 사항을 확인하세요.

  • 루트 또는 sudo 권한이 필요합니다.
  • 터미널/명령줄에 액세스할 수 있어야 합니다.
  • rsync를 안전하게 실행하기 위한 SSH 접근이 필요합니다.
  • rsync 테스트를 위해 최소 두 대의 컴퓨터가 필요합니다.

본 튜토리얼에서는 Linux Mint 21.1 Vera를 사용하지만, 다른 Linux 배포판에서도 문제없이 가이드를 따를 수 있습니다.

rsync를 scp 대신 사용하는 이유

scp(보안 복사)는 파일을 복사하는 데 널리 사용되는 명령줄 프로토콜로, 소스에서 대상으로 파일을 단순히 복사하는 선형적인 접근 방식을 사용합니다. 이 과정은 SSH를 통해 안전하게 수행됩니다.

scp 명령 구문은 다음과 같습니다.

scp option SOURCE DESTINATION

하지만 rsync가 scp보다 유리한 점은 무엇일까요?

rsync는 다음과 같은 다양한 이점을 제공합니다.

  • 더 빠른 실행 속도: rsync는 원격 업데이트 프로토콜을 사용하여 scp보다 빠르게 작동합니다. 이는 전체 파일을 전송하는 대신 변경된 부분만 전송하기 때문입니다. 첫 번째 동기화에서는 전체 복사가 수행되지만, 이후에는 델타 전송 알고리즘 덕분에 업데이트된 부분만 복사됩니다.
  • 낮은 대역폭 소비: rsync는 전체 파일을 다시 복사할 필요가 없어 대역폭 소비를 줄입니다. 또한 압축 및 압축 해제 알고리즘을 사용하여 전송되는 파일 크기를 최소화합니다.
  • 다양한 명령줄 옵션: rsync는 scp보다 훨씬 다양한 명령줄 옵션을 제공하여 사용자가 필요에 맞게 더 세밀하게 조정할 수 있도록 합니다.

결론적으로 rsync는 훌륭한 증분 동기화 도구입니다. scp도 안전한 파일 전송에 유용하지만, 간단한 접근 방식이 필요한 경우에 적합합니다. 반복적인 작업에는 rsync를 사용하는 것이 더 효율적입니다.

rsync 명령 구문

rsync 명령의 기본 구문은 다음과 같습니다.

rsync [OPTION] SOURCE DEST

각 용어의 의미는 다음과 같습니다.

  • OPTION: rsync 옵션
  • SOURCE: 소스 디렉토리
  • DEST: 대상 디렉토리
  • USER: 원격 사용자 이름
  • HOST: 원격 호스트 이름 또는 IP 주소

옵션은 명령에 추가 기능을 부여하는 매개변수입니다. 예를 들어, -r 옵션을 사용하여 데이터를 재귀적으로 동기화할 수 있습니다. 그러나 -r 옵션은 그룹 및 사용자 소유권, 타임스탬프, 권한, 심볼릭 링크 등을 동기화하지 않습니다. 대신 -a 옵션(아카이브 모드)을 사용하면 파일 소유권, 권한, 심볼릭 링크가 복사 과정에서 보존됩니다.

주요 rsync 옵션은 다음과 같습니다.

  • -z: 데이터 압축을 통해 전송 효율성 증가
  • -h: 사람이 읽기 쉬운 형식으로 출력 제공
  • -b: 데이터 동기화 과정에서 백업 생성
  • -e: SSH 프로토콜을 사용한 원격 데이터 전송
  • --progress: 데이터 동기화 진행 상황 실시간 표시
  • -v: 자세한 출력 제공
  • -n: 실제 실행 없이 설정을 테스트 (모의 실행)
  • -q: rsync 명령 출력 및 옵션 억제

rsync 설치

대부분의 Unix 및 Linux 시스템에는 rsync가 기본적으로 설치되어 있습니다. 시스템에 rsync가 없는 경우 다음 명령을 사용하여 설치할 수 있습니다.

Debian/Ubuntu 및 Mint:

sudo apt-get install rsync

Arch Linux:

pacman -S rsync

Gentoo:

emerge sys-apps/rsync

CentOS/Fedora/REHL:

sudo yum install rsync

openSUSE:

sudo zypper install rsync

Linux Mint를 사용하는 경우 rsync는 이미 설치되어 있으므로 터미널에서 rsync 명령을 실행하여 설치 상태를 확인할 수 있습니다. rsync의 기능, 옵션, 기타 중요한 정보가 출력됩니다.

rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

이제 다양한 사용 사례에서 rsync가 어떻게 작동하는지 살펴보겠습니다.

이 튜토리얼에서는 다음 두 개의 디렉터리를 만들 것입니다.

  • 소스 디렉토리
  • 목적지 디렉토리

다음 명령을 입력하여 디렉토리를 생성합니다.

mkdir source-directory
mkdir dest-directory

rsync를 테스트하기 위해 파일을 생성해야 합니다. 다음 명령을 사용하여 테스트 파일을 생성합니다.

touch source-directory/file{1..100}

이 명령은 소스 디렉토리에 100개의 빈 파일을 생성합니다. 다음 명령을 사용하여 확인할 수 있습니다.

ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

참고: dest-directory는 비어 있습니다.

로컬에서 디렉터리 재귀적으로 복사

rsync는 주로 로컬 서버와 원격 서버 간에 파일을 복사하는 데 사용되지만, 로컬 환경에서도 파일을 효율적으로 복사하는 데 유용합니다.

다음 rsync 구문을 사용하여 로컬 복사를 수행할 수 있습니다.

rsync option source target

다음 명령을 실행하여 소스 디렉터리의 파일을 대상 디렉터리로 복사합니다.

rsync -r source-directory/ dest-directory

이 명령은 소스 디렉터리에서 대상 디렉터리로 파일을 재귀적으로 복사합니다.

$ rsync -r source-directory/ dest-directory
$ ls dest-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

이제 소스 디렉터리의 모든 파일이 대상 디렉터리에 복사되었습니다.

로컬에서 단일 파일 복사

두 디렉터리를 동기화하는 방법을 익혔으므로 이제 단일 파일을 복사하는 방법을 알아보겠습니다.

이를 위해 source-directory의 빈 파일 file1을 편집한 후 dest-directory에 있는 동일한 파일과 동기화합니다.

파일을 편집하려면 다음 명령을 입력하십시오.

nano source-directory/file1

이제 다음 텍스트를 복사하여 nano 편집기에 붙여넣으십시오.

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.

파일에 콘텐츠 추가

이제 파일을 닫고 저장합니다.

이제 rsync를 사용하여 파일을 복사해 보겠습니다.

sudo rsync -v --existing source-directory/file1 dest-directory
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80

--existing 옵션을 사용했습니다. 이 옵션은 기존 파일을 업데이트합니다. --existing 옵션 없이 명령을 실행하면 명령은 성공적으로 실행되지만 파일은 업데이트되지 않습니다.

복사하려는 단일 파일이 대상 폴더에 없는 경우 다음 명령을 실행해야 합니다.

rsync -v source-directory/newfile dest-directory
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

여러 파일 복사

여러 파일을 복사하려는 경우 복사할 파일의 원본 경로와 대상 디렉터리를 지정해야 합니다.

source-directorynewfile2newfile3라는 두 개의 새 파일을 생성합니다. 다음 명령을 실행합니다.

touch source-directory/newfile{2..3}

이제 다음 명령을 사용하여 여러 파일을 동기화하십시오.

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00

로컬에서 원격으로 파일 또는 디렉토리 복사

로컬에서 원격으로 파일을 전송하기 위한 rsync 구문은 다음과 같습니다.

rsync option SOURCE [email protected]:DEST

이 작업을 수행하려면 원격 시스템의 IP 주소를 알아야 합니다. 또한, 소스 파일 뒤에 IP 주소를 추가해야 합니다.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

전송을 시작하기 전에 암호를 묻습니다. 계속하려면 입력하십시오. 또한 사용자가 원격 시스템에서 다른 경우 IP 주소 뒤에 @가 오기 전에 지정해야 합니다.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

여러 파일 또는 디렉터리를 복사하려는 경우 파일 또는 디렉터리 경로를 나열해야 합니다. 구문은 다음과 같습니다.

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

원격 전송 관련 프로토콜

rsync를 사용하면 특정 파일 전송 프로토콜을 지정할 수 있습니다. 이렇게 하려면 프로토콜 다음에 -e 옵션을 사용해야 합니다.

예를 들어, SSH 프로토콜을 사용하려면 rsync 명령에 -e ssh를 추가해야 합니다.

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

원격에서 로컬로 파일 또는 디렉토리 복사

원격에서 로컬로 파일을 전송하기 위한 rsync 구문은 다음과 같습니다.

rsync option [email protected]:SRC DEST

풀 요청 역할을 합니다. 따라서 원격 서버에서 로컬 시스템으로 필요한 파일/디렉터리를 가져오려면 다음 명령을 실행해야 합니다.

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

이 명령은 원격 시스템의 대상 디렉토리에 있는 파일을 로컬 시스템의 소스 디렉토리로 가져옵니다.

마찬가지로 전체 경로를 통해 지정하여 특정 파일을 가져올 수 있습니다.

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

로컬에서 원격으로 여러 파일 또는 디렉터리를 복사하려면 서버 IP 주소 뒤에 중괄호(쉼표로 구분) 안에 경로를 지정해야 합니다.

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

마찬가지로 파일도 지정할 수 있습니다.

전송 중 실시간 진행 상황 표시

대규모 데이터 백업의 경우, 진행 상황을 실시간으로 확인하는 것이 좋습니다. 이를 위해서는 --progress 플래그를 사용해야 합니다. rsync 명령에 추가하면 전송 속도, 남은 시간, 전송된 데이터 양을 확인할 수 있습니다.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

전송이 완료되면 소스 파일 삭제

--remove-source-files 플래그를 사용하여 전송 완료 후 소스 파일을 제거할 수 있습니다. 이는 파일을 보호하거나 단순히 공간을 확보하기 위해 파일을 사용하는 경우에 유용합니다.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

rsync 드라이런

rsync를 사용하면 실제 실행을 수행하기 전에 평가할 수 있습니다. 모의 실행을 통해 올바른 작업을 수행하고 있는지 확인할 수 있습니다. 실수로 파일을 업데이트하거나 삭제하는 것을 피할 수 있습니다.

테스트 실행을 수행하려면 --dry-run 옵션을 사용해야 합니다. 명령에 추가하고 소스와 대상을 지정하십시오.

sudo rsync -v --dry-run source-directory/file1 dest-directory
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)

출력은 이전에 실행한 것과 비슷하지만 출력 끝에 (DRY RUN)이 표시됩니다.

최소 및 최대 파일 크기 설정

rsync를 사용하면 전송 중 최소 또는 최대 파일 크기를 설정할 수 있습니다.

따라서 최소 15KB 크기로 전송하려면 --min-size=15k를 사용해야 합니다.

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

이 명령은 최소 파일 크기가 15KB인 파일만 복사합니다. 파일 크기가 그 이하이면 무시합니다.

마찬가지로 --max-size 플래그를 사용하여 최대 파일 크기를 설정할 수 있습니다.

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

여기서 rsync는 450KB 이상의 파일을 무시합니다.

대역폭 제한 설정

대역폭을 많이 사용하는 다른 작업을 수행하는 경우 rsync를 설정하여 전송에 대한 대역폭 제한을 설정할 수 있습니다. 이렇게 하려면 --bwlimit=KB/s를 사용합니다.

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

여기서는 전송 중에 대역폭을 100Kb/s로 설정합니다.

마무리

이것으로 rsync 명령 가이드가 끝났습니다. rsync 사용법을 배우고 다양한 명령을 효과적으로 처리하는 방법을 이해했습니다.

그러나 rsync는 다룬 것보다 훨씬 더 많은 기능을 제공합니다. rsync 매뉴얼 페이지에서 rsync의 모든 측면을 살펴볼 수도 있습니다.

다음으로 Windows, Linux 및 macOS용 명령줄 치트 시트를 참조하십시오.