간단한 일회성 복사를 넘어서는 무엇이든 rsync로, 다른 박스에 파일 하나 지금 당장 옮기고 싶을 뿐이라면 scp로 하세요. 핵심 차이: scp는 매번 파일 전체를 다시 스트리밍하고 끊긴 연결에 대한 기억이 없는 반면, rsync는 원본과 대상을 비교해 변경된 블록만 전송하고 중단된 복사를 멈춘 지점에서 이어받습니다. 불안정한 회선 위의 대형 백업에서 이것이 2분과 처음부터 다시 시작의 차이입니다. 둘 다 사실상 모든 Linux 배포판에 OpenSSH와 함께 들어오므로 설치 선택이 아니라 습관 선택이고 — 그 습관의 기본값은 rsync여야 합니다. 아래에서: 정면 비교 표, 실제 속도 차이, scp에는 불가능한 이어받기 요령, 그리고 scp가 여전히 정답인 경우들.
rsync와 scp의 차이는 무엇일까?
scp는 한 가지만 합니다: SSH 채널을 열고, 바이트를 흘려보내고, 닫습니다. 실행 사이에 상태가 없으므로 전송이 90%에서 죽으면 0부터 다시 시작합니다.
rsync는 SSH를 전송 수단으로 사용하는 동기화 도구입니다. 보내기 전에 대상 파일의 체크섬 목록을 만들고(rolling-checksum 델타 알고리즘) 다른 블록만 전송합니다. 같은 명령을 두 번 실행하면 두 번째 패스는 거의 아무것도 옮기지 않습니다. 덕분에 rsync는 두 디렉터리를 동기 상태로 유지하는 자연스러운 도구이기도 합니다 — 예약해 두면 매 실행이 델타만 복사합니다.
실무적 결과:
- 중단: rsync는 이어받고, scp는 파일을 다시 시작합니다.
- 두 번째 복사: rsync는 변경분만 보내고, scp는 전부 다시 보냅니다.
- 삭제: rsync는
--delete로 삭제까지 미러링할 수 있고, scp는 안 됩니다. - 필터링: rsync에는
--exclude패턴이 있고, scp는 가리킨 것을 전부 복사합니다. - 드라이런: rsync는
--dry-run으로 예상 결과를 보여 주고, scp는 아무것도 제공하지 않습니다.
rsync가 scp보다 빠를까?
빠른 회선에서 대형 파일 하나를 처음 복사할 때는 비슷합니다 — 둘 다 SSH를 채우고 있고 체크섬 패스가 더하는 오버헤드는 작습니다. 격차가 벌어지는 곳은 세 곳입니다:
- 소형 파일 대량 복사. rsync는 디렉터리 순회를 파이프라인화하고 연결 하나를 재사용할 수 있습니다; 구형 scp 방식은 파일당 작업을 낳았습니다. 수천 개의 자잘한 파일(
node_modules, WordPress 설치물)은 rsync가 눈에 띄게 빨리 끝냅니다. - 재실행. 4 GB 파일에서 50 MB만 바뀌었다면 rsync는 대략 50 MB를 옮기고; scp는 4 GB를 또 옮깁니다.
- 압축.
-z는 전송 중 압축하는데, 느린 WAN 회선에서 도움이 됩니다.
직접 시간을 재볼 수도 있습니다 — 명령어 모양은 동일합니다:
# 같은 파일, 같은 서버, 둘 다 SSH로
time scp bigfile.tar.gz user@server:/tmp/
time rsync -avh --progress bigfile.tar.gz user@server:/tmp/
# 둘 다 재실행: scp는 재복사, rsync는 검증 후 거의 아무것도 보내지 않는다
time scp bigfile.tar.gz user@server:/tmp/
time rsync -avh --progress bigfile.tar.gz user@server:/tmp/ 하루 종일 서버를 오가는 사람이라면 전송 속도는 한 번쯤 재볼 만한 항목입니다 — 바쁜 호스트에서 ss가 netstat를 이기는 것과 같은 맥락입니다(ss vs netstat: 어떤 Linux 포트 명령어를 쓸까 참고).
scp는 끊긴 전송을 이어받을 수 있을까?
아니요. scp에 이어받기는 없습니다; 1 GB 중 900 MB에서 연결이 끊기면 처음부터 다시입니다. rsync-vs-scp 논쟁마다 가장 많이 인용되는 이유이고, 실제입니다.
rsync의 설계 전체가 “전송은 때때로 끊긴다”를 전제합니다. 정석 이어받기 주문:
rsync -avh --partial --append-verify --progress bigfile.tar.gz user@server:/srv/backup/ --partial은 반쯤 쓰인 파일을 지우지 않고 유지합니다.--append-verify는 이어 붙인 뒤 붙은 구간을 체크섬으로 검증합니다 — 옛 평범한--append와 달리 손상된 부분 파일에도 안전합니다.--progress는 어디서 이어받았는지 보여 줍니다.
재시도 루프로 감싸면 적대적인 회선에서도 set-and-forget 백업이 됩니다:
until rsync -avh --partial --append-verify --progress
./bigfile.tar.gz user@server:/srv/backup/; do
sleep 5
done rsync 대신 scp를 써야 하는 때는?
scp가 여전히 정답인 경우는 몇 되지 않습니다:
- 작은 파일 하나, 단 한 번.
scp app.conf user@host:/etc/myapp/을 치는 것이 어떤 rsync 호출보다 짧고, 이어받을 것도 없습니다. - 반대쪽에 rsync가 없을 때. rsync는 양쪽에 바이너리가 필요합니다. 많은 미니멀 컨테이너와 어플라이언스는 scp의 SFTP 서버는 있지만 rsync는 없습니다.
- rsync 서버를 노출하고 싶지 않을 때. 드물지만 일부 환경은 rsync 데몬을 명시적으로 잠급니다.
알아둘 미묘한 사실 하나: OpenSSH 프로젝트는 scp의 원래 프로토콜을 몇 년 전에 폐기했고 현대의 scp는 실제로 밑에서 SFTP를 말합니다. 경로 탈출 쿼크 하나는 고쳐졌지만, 여기서 중요한 두 제한 — 이어받기 없음, 델타 전송 없음 — 은 그대로입니다. 프로토콜 교체가 scp를 rsync로 만들지는 않습니다.
관련 서사 하나: 질문이 사실 “rsync vs cp”라면 답은 이것의 거울상입니다 — cp는 scp의 로컬 전용판(이어받기 없음, 델타 없음, 플래그를 붙이지 않으면 속성 보존도 없음)이고 rsync는 로컬과 원격 모두를 처리합니다. 로컬 일회성 복사라면 cp로 충분합니다.
가장 중요한 rsync 플래그는?
대부분의 사람에게 필요한 것은 한 줄입니다:
rsync -avh --partial --progress src/ user@server:/srv/dest/ | 플래그 | 하는 일 |
|---|---|
-a (archive) | 재귀 + 권한, 시간, 그룹, 심볼릭 링크, 디바이스 보존 |
-v (verbose) | 전송 항목을 표시 |
-h (human) | 사람이 읽는 크기 단위 |
--partial | 부분 전송된 파일을 유지해 재실행 시 이어받기 |
--progress | 파일별 진행률 — scp에는 영원히 없던 것 |
-z | 전송 중 압축 (빠른 LAN + 느린 CPU라면 생략) |
--delete | 삭제까지 미러링 — 위험, 반드시 dry run과 함께 |
--dry-run (-n) | 무슨 일이 벌어질지 보여 주고 아무것도 바꾸지 않음 |
채택할 만한 습관 두 가지. 첫째, --delete가 들어간 것은 반드시 드라이런부터:
rsync -avh --delete --dry-run src/ user@server:/srv/dest/ # 검토
rsync -avh --delete src/ user@server:/srv/dest/ # 그다음 실행 둘째, 끝의 슬래시를 조심하세요 — /srv/src는 디렉터리 자체를 대상 안으로 복사하고, /srv/src/는 그 내용물을 복사합니다. 모두가 한 번씩 걸리는 함정이고, rsync는 반대 형태를 의도했을 때조차 “no bytes transferred” 경고를 띄웁니다.
매일 또는 매주 동기화라면 rsync를 systemd 타이머에 넣고 델타만 복사하게 두세요 — 예약의 journalctl 쪽은 the journalctl cheat sheet가 다룹니다.
rsync vs scp: 결론
| scp | rsync | |
|---|---|---|
| OpenSSH 기본 포함 | 예 | 예 (양쪽 모두 필요) |
| 끊긴 전송 이어받기 | 아니요 | 예 (--partial) |
| 재실행 시 델타 전송 | 아니요 | 예 |
| 권한/심볼릭 링크 보존 | 부분적 | 완전 (-a) |
| 제외 패턴 | 아니요 | --exclude |
| 드라이런 | 아니요 | --dry-run |
| 삭제 미러링 | 아니요 | --delete |
| 적합한 용도 | 빠른 일회성 복사 | 백업, 동기화, 대량 트리 |
백업, 큰 트리, 끊길 수 있는 회선 위의 무엇이든, 두 번 이상 실행할 무엇이든 — 기본값은 rsync입니다. scp는 명령어가 생각보다 짧을 때 쓰세요. 플래그 하나만 가져가라면 --partial을 가져가세요 — 앞으로의 모든 연결 끊김을 ‘재시작’이 아니라 ‘일시정지’로 바꿔 줍니다.
— mrsaynothing
Get the next one by email
One email per post. No spam, no algorithms.
what is this?GGUF 모델 로컬 실행법: Ollama, llama.cpp, vLLM
글이 마음에 드셨나요? 제 본업이 바로 이런 일입니다. 저를 고용하세요