File Copy, Transfer & Sync Tools
cp, scp, rsync, rclone 비교 및 용도별 선택 가이드
🎯 도구 비교 요약
| 도구 | 용도 | 특징 | 적합한 경우 |
|---|---|---|---|
| cp | 로컬 복사 | 기본 명령어, 간단 | 같은 시스템 내 복사 |
| scp | 원격 복사 | SSH 기반, 간단 | 원격 서버에 파일 몇 개 복사 |
| rsync | 동기화 | 델타 전송, 증분 | 백업, 대용량, 반복 작업 |
| rclone | 클라우드 동기화 | 40+ 클라우드 지원 | S3, GDrive 등 클라우드 |
📋 cp (Copy)
로컬 파일/디렉토리 복사의 기본임.
기본 사용법
# 파일 복사
cp file.txt /dest/
# 파일 복사 (이름 변경)
cp file.txt /dest/newname.txt
# 여러 파일 복사
cp file1.txt file2.txt /dest/
# 디렉토리 복사 (-r)
cp -r ./folder /dest/
주요 옵션
| 옵션 | 설명 |
|---|---|
-r | 디렉토리 재귀 복사 (필수) |
-p | 권한, 소유자, 타임스탬프 유지 |
-a | 아카이브 모드 (-r + -p + 심볼릭링크 등 모두 유지) |
-i | 덮어쓰기 전 확인 (interactive) |
-f | 강제 덮어쓰기 (force) |
-v | 복사 과정 출력 (verbose) |
-u | 대상보다 새로운 파일만 복사 (update) |
-n | 덮어쓰지 않음 (no-clobber) |
-l | 복사 대신 하드링크 생성 |
-s | 복사 대신 심볼릭링크 생성 |
자주 쓰는 조합
# 디렉토리 전체 복사 (권한 유지)
cp -rp /source/ /dest/
# 아카이브 모드 (가장 안전)
cp -a /source/ /dest/
# 확인하면서 복사
cp -iv file.txt /dest/
# 새로운 파일만 복사 (업데이트)
cp -u /source/* /dest/
# 진행 상황 보기
cp -rv /source/ /dest/
와일드카드 사용
# 모든 txt 파일
cp *.txt /dest/
# 특정 패턴
cp file?.txt /dest/ # file1.txt, fileA.txt 등
cp file[1-3].txt /dest/ # file1.txt, file2.txt, file3.txt
# 숨김 파일 포함
cp -a /source/. /dest/ # 점(.)으로 숨김 파일 포함
주의사항
# 슬래시 유무 차이
cp -r /source /dest/ # /dest/source/ 생성
cp -r /source/ /dest/ # /dest/ 안에 내용물 복사 (source 폴더 자체는 안 생김)
# ※ 이건 rsync와 다름. cp는 슬래시 유무 상관없이 비슷하게 동작
# 심볼릭 링크 처리
cp file.txt # 링크가 가리키는 파일 복사
cp -P file.txt # 링크 자체를 복사
cp -a # 링크 자체를 복사 (-P 포함)
장단점
| 장점 | 단점 |
|---|---|
| 간단하고 직관적 | 원격 복사 불가 |
| 별도 설치 불필요 | 증분 복사 없음 |
| 빠름 (로컬) | 대용량은 rsync가 나음 |
📁 scp (Secure Copy)
SSH 기반 원격 파일 복사 도구임.
기본 사용법
# 로컬 → 원격
scp file.txt user@remote:/path/to/destination/
# 원격 → 로컬
scp user@remote:/path/to/file.txt ./
# 디렉토리 복사 (-r)
scp -r ./folder user@remote:/path/to/
# 포트 지정 (-P)
scp -P 2222 file.txt user@remote:/path/
주요 옵션
| 옵션 | 설명 |
|---|---|
-r | 디렉토리 재귀 복사 |
-P | 포트 지정 (대문자 주의) |
-p | 권한, 타임스탬프 유지 |
-C | 압축 전송 |
-i | SSH 키 파일 지정 |
-q | 진행 상황 숨김 |
-l | 대역폭 제한 (Kbit/s) |
예시
# SSH 키로 원격 복사
scp -i ~/.ssh/mykey.pem file.txt ec2-user@1.2.3.4:/home/ec2-user/
# 압축 + 디렉토리 복사
scp -rC ./logs user@backup-server:/backup/
# 원격 → 원격 (두 서버 간 직접 복사)
scp user1@server1:/file.txt user2@server2:/path/
# 대역폭 제한 (1000 Kbit/s = 약 125KB/s)
scp -l 1000 largefile.tar.gz user@remote:/path/
장단점
| 장점 | 단점 |
|---|---|
| 간단하고 직관적 | 매번 전체 파일 복사 |
| SSH 기반 (보안) | 증분 전송 없음 |
| 별도 설치 불필요 | 대용량/반복 작업에 비효율 |
| 중단 시 이어받기 불가 |
🔄 rsync (Remote Sync)
델타 전송 기반 고효율 동기화 도구임.
핵심 개념
델타 전송: 파일의 변경된 블록만 전송하여 네트워크/시간 절약함.
기본 사용법
# 기본 동기화 (로컬)
rsync -av /source/ /destination/
# 원격 동기화 (SSH)
rsync -avz /source/ user@remote:/destination/
# 원격 → 로컬
rsync -avz user@remote:/source/ /destination/
주요 옵션
| 옵션 | 설명 |
|---|---|
-a | 아카이브 모드 (권한, 소유자, 타임스탬프 등 유지) |
-v | 상세 출력 (verbose) |
-z | 압축 전송 |
-P | 진행률 표시 + 부분 전송 재개 |
--delete | 소스에 없는 파일은 대상에서 삭제 |
-n | Dry-run (실제 실행 안 함, 테스트용) |
-e | 원격 쉘 지정 (예: ssh -p 2222) |
--exclude | 제외 패턴 |
--include | 포함 패턴 |
--bwlimit | 대역폭 제한 (KB/s) |
자주 쓰는 조합
# 기본 동기화 (권장)
rsync -avz /source/ user@remote:/dest/
# 진행률 + 이어받기
rsync -avzP /source/ user@remote:/dest/
# 미러링 (삭제 포함)
rsync -avz --delete /source/ user@remote:/dest/
# Dry-run (테스트)
rsync -avzn --delete /source/ user@remote:/dest/
# 특정 포트
rsync -avz -e 'ssh -p 2222' /source/ user@remote:/dest/
# 대역폭 제한 (1000 KB/s)
rsync -avz --bwlimit=1000 /source/ /dest/
⚠️ 경로 끝 슬래시(/) 주의
cp와 차이: cp는 슬래시 유무와 관계없이 동작이 비슷하지만, rsync는 슬래시 유무로 동작이 달라짐!
제외/포함 패턴
# 특정 파일 제외
rsync -av --exclude '*.log' /source/ /dest/
# 여러 패턴 제외
rsync -av --exclude '*.log' --exclude '*.tmp' --exclude '.git' /source/ /dest/
# 제외 파일 사용
rsync -av --exclude-from='exclude-list.txt' /source/ /dest/
# exclude-list.txt 예시:
# *.log
# *.tmp
# .git/
# node_modules/
백업 시나리오
증분 백업:
#!/bin/bash
# 매일 실행하는 증분 백업
SOURCE="/data/"
DEST="/backup/data/"
LOG="/var/log/backup-$(date +%Y%m%d).log"
rsync -avz --delete \
--exclude '*.tmp' \
--exclude 'cache/' \
"$SOURCE" "$DEST" \
> "$LOG" 2>&1
스냅샷 백업 (하드링크 활용):
#!/bin/bash
# 일별 스냅샷 (이전 백업과 하드링크로 용량 절약)
DATE=$(date +%Y-%m-%d)
SOURCE="/data/"
DEST="/backup/snapshots/"
LATEST="$DEST/latest"
CURRENT="$DEST/$DATE"
rsync -avz --delete \
--link-dest="$LATEST" \
"$SOURCE" "$CURRENT"
# latest 심볼릭 링크 갱신
rm -f "$LATEST"
ln -s "$CURRENT" "$LATEST"
rsync daemon 모드
별도 포트(873)로 rsync 서비스 운영 가능함.
/etc/rsyncd.conf:
[backup]
path = /data/backup
comment = Backup Directory
read only = no
list = yes
auth users = backupuser
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
# 클라이언트에서 접속
rsync -avz /source/ backupuser@server::backup/
장단점
| 장점 | 단점 |
|---|---|
| 델타 전송 (효율적) | scp보다 문법 복잡 |
| 증분 백업 가능 | 클라우드 직접 지원 안 함 |
| 중단 후 재개 가능 | |
| 다양한 옵션 | |
| 대역폭 제한 가능 |
☁️ rclone (Rsync for Cloud)
클라우드 스토리지 동기화 도구임.
지원 서비스 (40+)
| 유형 | 예시 |
|---|---|
| Object Storage | AWS S3, GCS, Azure Blob, MinIO |
| Cloud Drive | Google Drive, OneDrive, Dropbox |
| FTP/SFTP | FTP, SFTP, WebDAV |
| 기타 | Backblaze B2, Wasabi, Mega |
설치
# Linux
curl https://rclone.org/install.sh | sudo bash
# 또는 패키지 매니저
sudo apt install rclone # Ubuntu/Debian
sudo yum install rclone # CentOS/RHEL
설정
# 대화형 설정
rclone config
# 설정 파일 위치
~/.config/rclone/rclone.conf
S3 설정 예시:
[mys3]
type = s3
provider = AWS
env_auth = false
access_key_id = AKIAXXXXXXXX
secret_access_key = xxxxxxxxxxxxxxxx
region = ap-northeast-2
Google Drive 설정:
rclone config
# n) New remote
# name: gdrive
# Storage: drive
# (OAuth 인증 진행)
기본 명령어
# 리모트 목록
rclone listremotes
# 파일 목록
rclone ls mys3:bucket-name/
rclone lsd mys3:bucket-name/ # 디렉토리만
# 복사 (로컬 → 클라우드)
rclone copy /local/path mys3:bucket-name/path/
# 복사 (클라우드 → 로컬)
rclone copy mys3:bucket-name/path/ /local/path/
# 동기화 (미러링)
rclone sync /local/path mys3:bucket-name/path/
# 양방향 동기화
rclone bisync /local/path mys3:bucket-name/path/
copy vs sync vs bisync
| 명령어 | 동작 |
|---|---|
copy | 소스 → 대상 복사 (대상의 기존 파일 유지) |
sync | 소스 → 대상 미러링 (대상에만 있는 파일 삭제) |
bisync | 양방향 동기화 |
주요 옵션
| 옵션 | 설명 |
|---|---|
-P | 진행률 표시 |
--dry-run | 테스트 (실제 실행 안 함) |
-v | 상세 출력 |
--exclude | 제외 패턴 |
--bwlimit | 대역폭 제한 |
--transfers | 동시 전송 수 (기본 4) |
실전 예시
# S3 버킷 동기화
rclone sync /data/backup mys3:my-backup-bucket/ -P
# Google Drive 백업
rclone copy /home/user/documents gdrive:Backups/documents/ -P
# 특정 파일만
rclone copy mys3:bucket/ /local/ --include "*.csv"
# 대역폭 제한 (10MB/s)
rclone sync /data mys3:bucket/ --bwlimit 10M
# Dry-run
rclone sync /data mys3:bucket/ --dry-run -v
마운트 기능
클라우드 스토리지를 로컬 디렉토리처럼 마운트 가능함:
# S3 버킷 마운트
rclone mount mys3:bucket-name /mnt/s3 --daemon
# Google Drive 마운트
rclone mount gdrive: /mnt/gdrive --daemon
# 언마운트
fusermount -u /mnt/s3
장단점
| 장점 | 단점 |
|---|---|
| 40+ 클라우드 지원 | 로컬 ↔ 로컬은 rsync가 나음 |
| 통일된 인터페이스 | 설정 필요 |
| 암호화 지원 (crypt) | |
| 마운트 기능 |
🆚 언제 뭘 쓰나
| 상황 | 권장 도구 |
|---|---|
| 같은 서버 내 파일 복사 | cp |
| 원격 서버에 파일 몇 개 복사 | scp |
| 서버 간 백업/동기화 | rsync |
| 대용량 디렉토리 동기화 | rsync |
| 정기 백업 자동화 | rsync + cron |
| S3, GCS 등 클라우드 | rclone |
| Google Drive, Dropbox | rclone |
| 클라우드 마운트 | rclone |
전송 효율 비교
📋 명령어 요약
cp
cp file.txt /dest/ # 파일 복사
cp -r ./dir /dest/ # 디렉토리 복사
cp -a /source/ /dest/ # 아카이브 (권한 유지)
cp -u /source/* /dest/ # 새로운 것만 복사
scp
scp file.txt user@remote:/path/ # 업로드
scp user@remote:/path/file.txt ./ # 다운로드
scp -r ./dir user@remote:/path/ # 디렉토리
scp -P 2222 file.txt user@remote:/path/ # 포트 지정
rsync
rsync -avz /src/ /dest/ # 로컬 동기화
rsync -avz /src/ user@remote:/dest/ # 원격 동기화
rsync -avzP /src/ user@remote:/dest/ # 진행률 + 재개
rsync -avz --delete /src/ /dest/ # 미러링
rsync -avzn /src/ /dest/ # Dry-run
rclone
rclone config # 설정
rclone ls remote:bucket/ # 목록
rclone copy /local remote:bucket/ -P # 복사
rclone sync /local remote:bucket/ -P # 동기화
rclone mount remote:bucket /mnt --daemon # 마운트