큰 디렉토리 트리를 로컬로 복사 하시겠습니까? cp 또는 rsync?


230

1.8TB 정도의 큰 디렉토리 트리를 복사해야합니다. 모두 현지입니다. 습관이 rsync없으면 사용할 것이지만, 요점이 많고 오히려 사용해야하는지 궁금합니다 cp.

권한과 uid / gid에 대해 걱정됩니다. 복사본에서 보존해야하기 때문에 rsync 가이 작업을 수행한다는 것을 알고 있습니다. 심볼릭 링크와 같은 것들.

대상이 비어 ​​있으므로 일부 파일을 조건부로 업데이트 할 필요가 없습니다. 그것은 모두 로컬 디스크이므로 ssh 또는 네트워크에 대해 걱정할 필요가 없습니다.

rsync에서 유혹을 느끼는 이유는 rsync가 필요한 것보다 많은 것을 할 수 있기 때문입니다. rsync는 파일을 체크섬합니다. 나는 그것을 필요로하지 않으며 cp보다 오래 걸릴 수 있다고 우려합니다.

그래서 당신은 무엇을 생각한다, 할 rsynccp?


2
rsync가 원하는 작업을 정확하게 수행하고 이미이 특정 응용 프로그램의 사용법에 익숙하고 취향에 맞게 빠르게 작동한다면 왜 지구상에서 전환하고 싶습니까?
eleven81

2
rsync가 cp보다 시간이 오래 걸리기 때문에 rsync는 cp가 수행하지 않는 많은 체크섬을 수행하기 때문에
Rory

1
체크섬의 CPU 오버 헤드는 디스크 / 네트워크 i / o에 비해 작습니다. 디스크가 동일한 시스템에 있지 않고 OS가 버스 컨트롤러에서 영리한 드라이브 드라이브 복사를 수행 할 수 없다면.
Martin Beckett

3
크기와 타임 스탬프 확인이 다른 파일에서 체크섬이 수행됩니다. 편집중인 경우 (복사 중 정전 후와 같이) 모든 파일에 대해 체크섬을 강제 할 수 있지만 로컬 전송에서는 처음부터 시작하는 것보다 느립니다.
korkman

3
그는 자신의 작업 흐름을 개선하는 데 관심이 있고 모든 것을 알고 있다고 생각하면서 모래에 머리를 묻지 않습니다. 이 의견은 정말 귀찮습니다.
Martin Konecny

답변:


204

rsync는 어떤 이유로 든 중단되면 매우 적은 비용으로 쉽게 다시 시작할 수 있음을 의미하므로 rsync를 사용합니다. 그리고 rsync이기 때문에 큰 파일을 통해 부분적으로 다시 시작할 수도 있습니다. 다른 사람들이 언급했듯이 파일을 쉽게 제외시킬 수 있습니다. 대부분의 것들을 보존하는 가장 간단한 방법은 -a'아카이브'플래그 를 사용하는 것입니다 . 그래서:

rsync -a source dest

UID / GID 및 심볼릭 링크는 -a( -lpgo)에 의해 보존되지만 질문 은 파일 시스템 정보 의 전체 사본을 원할 수 있음을 암시합니다 . 와 -a하드 링크, 확장 속성, 또는 (리눅스)의 ACL 또는 이상 포함되지 않습니다 않으며 따라서 (OS X의에) 리소스 포크를, 파일 시스템의 강력한 사본을, 당신은 그 플래그를 포함해야합니다 :

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

-u플래그는 "SOURCE 파일이 대상 파일보다 최신이거나 대상 파일이 누락 된 경우에만 복사" 하지만 기본 cp가 다시 시작됩니다 . 그리고 -a(아카이브) 플래그는 다시 시작하고 권한을 보존해야하는 경우 파일을 다시 복사하지 재귀 될 것입니다. 그래서:

cp -au source dest

5
cp의 -u 플래그는 아마도 부분적으로 복사 / 손상된 파일을 감지하지 않으므로 최상의 솔루션이 아닐 수 있습니다. rsync의 좋은 점은 md5가 파일을 합산하여 차이를 감지 할 수 있다는 것입니다.
Chad Huneycutt

3
-w (--whole-file) 옵션을 추가하면 체크섬 대신 파일을 복사하기 때문에 중단 된 rsync 속도가 빨라집니다.
hayalci

13
실제로 rsync는 로컬 전송을 감지하고 자동으로 체크섬하지 않고 전체 파일 복사를 가능하게합니다.
korkman

22
--progress는 정말 편리합니다!
Matt

12
-P 또는 --progress는 각 파일의 진행률을 개별적으로 보여줍니다. 많은 (수천 개의) 작은 파일이 아니라 큰 파일을 복사하는 데 유용합니다. 읽을 수없는 더 많은 출력을 의미하기 때문입니다. 모든 파일의 전체 진행률이 표시되지는 않습니다.
SPRBRN

106

로컬 파일 시스템으로 복사 할 때 항상 다음 rsync 옵션을 사용합니다.

# rsync -avhW --no-compress --progress /src/ /dst/

내 추론은 다음과 같습니다.

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

다른 답변에서 제안한대로 다음 tar 명령보다 위의 rsync 설정을 사용하여 전송 속도가 17 % 더 빨랐습니다.

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
rsync: --no-compress: unknown option@Ellis Percival 오류가 발생했습니다 .
alper

이것은 빨리 밝아지고 있습니다. 이 작업보다 빠릅니다 rm -rf /src/.
dgo

2
@alper와 마찬가지로 --no-compress는 내 rsync 버전 (CentOS 7에서)에 대한 옵션이 아니 었습니다. 대신 --compress-level = 0을 사용했습니다.
Paul

79

많은 양의 데이터를 복사해야 할 때 일반적으로 tar와 rsync의 조합을 사용합니다. 첫 번째 단계는 다음과 같이 tar하는 것입니다.

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

일반적으로 많은 양의 파일을 사용하면 tar가 어떤 이유로 든 처리 할 수없는 파일이 있습니다. 또는 프로세스가 중단되거나 파일 시스템 마이그레이션 인 경우 실제 마이그레이션 단계 전에 초기 복사를 수행 할 수 있습니다. 어쨌든, 초기 복사 후, 나는 모든 것을 동기화하기 위해 rsync 단계를 수행합니다.

# cd /dst; rsync -avPHSx --delete /src/ .

후행 슬래시 /src/가 중요합니다.


6
+1 타르가 일반적으로 rsync보다 큰 사본에 더 빠르다는 것을 알았습니다. 나는 마지막 rsync로 마무리하는 아이디어도 좋아합니다.
Geoff Fritz

2
대상 디렉토리가 비어있는 경우 tar를 선택하는 것이 좋습니다. 내 길은 : cd $ DSTDIR; tar c -C $ SRCDIR. | tar
asdmin

19
이것이이 방법의 아름다움입니다. 실제로 중간 tar 파일을 만들지 않기 때문에 두 배의 공간이 필요하지 않습니다. 파이프 앞의 tar는 데이터를 압축하여 stdout으로 스트리밍하고 파이프 뒤의 tar는 stdin에서 데이터를 가져 와서 압축을 풉니 다.
차드 허니 컷

4
12GB 전송에는 cp -a를, 42GB 전송에는이 방법을 사용했습니다. 타르 방법은 약 1/4 시간이 걸렸습니다.
NGaida

3
또한 pv진행 상황을 볼 수 있도록 중간에 배치 하여를 사용하여 모든 데이터의 크기를 추정했습니다 df. 또한 사용하는 --numeric-owner소스 디스크는 다른 시스템에서였다으로, 나는 싶지 않았다 tar소유자를 엉망으로 :tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
페트르 Pudlák

14

rsync

여기에 내가 사용하는 rsync가 있습니다. 간단한 명령에는 cp를 선호하지만 이것이 아닙니다.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

더 안전한 방법은 다음과 같습니다. cpio. 타르만큼 빠르며, 조금 더 빠를 수도 있습니다.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

타르

이것도 좋고 읽기 실패로 이어집니다.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

이것들은 모두 로컬 사본 전용입니다.


rsync에 -S 및 -D 플래그를 사용하는 이유는 무엇입니까?
miyalys 2013

7

당신이 선호하는 것. -a사용하기로 결정할 때 스위치를 잊지 마십시오 cp.

정말로 대답이 필요한 경우 : rsync를 사용하면 훨씬 더 유연합니다. 복사가 완료되기 전에 종료해야합니까? ctrl-c 만하고 등을 돌리 자마자 다시 시작하십시오. 일부 파일을 제외해야합니까? 그냥 사용하십시오 --exclude-from. 소유권 또는 권한을 변경해야합니까? rsync가 당신을 위해 그것을 할 것입니다.


-p 플래그는 다시 무엇을합니까?
Rory

1
소유권, 타임 스탬프 및 권한을 유지합니다.
innaM

5
cp -a가 더 좋습니다.
David Pashley

과연. 이에 따라 답변이 변경되었습니다.
innaM

7

rsync명령은 항상 전송하는 모든 바이트에서 체크섬을 계산합니다.

명령 행 옵션 --checksum은 파일의 체크섬을 사용하여 전송할 파일을 결정하는 데만 사용됩니다.

-c, --checksum 모드 시간 및 크기가 아닌 체크섬을 기준으로 건너 뛰기 "

맨 페이지에서도 다음과 같이 말합니다.

rsync는 항상 전체 파일 체크섬을 확인하여 전송 된 각 파일이 수신 측에서 올바르게 재구성되었는지 확인하지만 전송 후 자동 확인은이 옵션의 전송 전 "와 관련이 없습니다. 업데이트 할?" 검사.

그래서 rsync또한, 항상 경우에도, 수신 측에 전체 파일의 체크섬을 계산 -c/ --checksum옵션은 "OFF"입니다.


14
게시물에 여기에 몇 가지 흥미로운 정보가 추가 된 반면, 맹렬한 모욕은 게시물의 가치를 떨어 뜨립니다. 이 사이트는 건설적인 비난을위한 포럼이 아닙니다. 소스를 수정할 수 있다면 수정 사항을 패치로 제출 했습니까? github 또는 다른 버전에 버전을 게시 했습니까? 이것에 대해 너무 강하게 느낀다면, 불필요하게 모욕하는 대신 좀 더 건설적인 일을하려고하면 더 나을 수 있습니다.
Zoredache

예, 마지막 단락은 실제로 필요하지 않았습니다.
Sherwin Flight

6

rsync -aPhW --protocol=28RSYNC로 이러한 대용량 사본의 속도를 높이는 데 도움이됩니다. 90GiB를 통해 중간에 있다는 생각 때문에 항상 rsync를 사용합니다.


2
해당 명령 문자열에서 이전 프로토콜을 사용하면 어떤 가치가 있습니까?
ewwhite

1
Mac 시스템에서 Rsync의 이전 버전은 29와 같은 일부 최신 rsync 프로토콜 개정판에서 중단됩니다. 이전 프로토콜로 이동하도록 지시하면 계속해서 다시 확인하지 않습니다.
oneguynick

번호 28이 더 이상 유효하지 않다고 생각합니까?
SPRBRN

5

rsync는 훌륭하지만 트리를 메모리에 저장하기 때문에 실제로 큰 디렉토리 트리에 문제가 있습니다. 나는이 스레드를 발견했을 때 그들이이 문제를 해결할 수 있는지보고 싶었습니다.

나는 또한 발견했다 :

http://matthew.mceachen.us/geek/gigasync/

트리를 수동으로 분리하고 여러 rsync를 실행할 수도 있습니다.


12
버전 3을 사용하는 경우 전체 트리가 큰 경우 메모리에 전체 트리를 유지하지 않고 증분 재귀 알고리즘을 사용합니다. samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

이 스레드는 매우 유용했으며 결과를 얻을 수있는 옵션이 너무 많기 때문에 그 중 몇 가지를 벤치마킹하기로 결정했습니다. 내 결과가 다른 사람들에게 도움이 될 수 있다고 생각합니다.

1,753,200 개의 파일에 분산 된 532Gb 의 데이터 를 이동시키기 위해 다음 과 같은 시간을 가졌습니다.

  • rsync 232 분이 걸렸다
  • tar 206 분 걸렸다
  • cpio 225 분이 걸렸다
  • rsync + parallel 209 분 걸렸다

제 경우에는을 사용하는 것을 선호했습니다 rsync + parallel. 이 정보가 더 많은 사람들이 이러한 대안 중에서 결정하는 데 도움이되기를 바랍니다.

전체 벤치 마크는 여기 에 게시 됩니다


404 페이지를 찾을 수 없음
Amedee Van Gasse

1
감사합니다 @AmedeeVanGasse URL은 당신이보고 후 짧은 고정되었습니다 :)
arjones

왜 벤치마킹하지 cp않습니까? 이것이 질문의 제목입니다!
calandoa

@calandoa 내 생각은 cp즉, 안전하지 : 당신이 다시 시작해야 나누기 때, 그것이 내가 다시 시작할 수있는 옵션을 선호하는 방법, 에고는 rsync내가 가장 좋아하는 :)입니다
arjones

3

로컬 로컬 디렉토리 복사를 수행 할 때 "cp -van src dest"가 rsync보다 20 % 빠릅니다. 재시작 가능성까지는 "-n"이하는 일입니다. 부분적으로 복사 된 파일 만 rm하면됩니다. ISO 또는 그와 같은 것이 아니면 고통스럽지 않습니다.


2

ARJ는 너무 오래된 학교입니다! ARJ 및 / 또는 rsync가 성능을 제공 할 것이라고 의심합니다.

확실히 내가 항상하는 일은 cpio를 사용하는 것입니다.

find . -print | cpio -pdm /target/folder

이것은 CP보다 거의 빠르며, tar보다 빠르며 파이프가 없습니다.


2
"원래의 cpio 및 find 유틸리티는 AT & T의 Unix Support Group에서 작업하는 동안 Dick Haight에 의해 작성되었습니다. 이들은 1977 년 PWB / UNIX 1.0에서 처음 등장했습니다."-FreeBSD의 cpio맨 페이지.
Chris S

3
cpio불행히도 파일의 상한은 8GB입니다.

" 아무것도 파이프하지 않고 "[sic]. find명령을 제외하고는 목록에 파이프가 있습니다.find . -print | cpio -pdm /target/folder
warren

1

당신은 확실히 rclone 을 시도 하고 싶습니다 . 이건 미친 짓이야

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

LITEONIT LCS-256 (256GB) SSD와 로컬 복사본입니다.

--ignore-checksum첫 번째 런을 추가 하여 더 빠르게 만들 수 있습니다 .



0

tar 또한 작업을 수행하지만 rsync처럼 중단되는 것을 재개하지 않습니다.


오래된 대답이지만 압축 된 파일 아카이브를 만드는 데 TAR이 아닙니까? rsync 또는 cp와 같은 파일을 전송하는 데 어떻게 사용할 수 있습니까?
Sherwin Flight

@SherwinFlight CD 소스; 타르 CF-. | (cd dest; tar xf-)
pgs

0

ARJ를 사용하면 어떻게 되나요?

arj a -jm -m1 -r -je filepack /source

-jm -m1압축 수준은 어디에 있으며 -je실행 파일로 만듭니다. 이제 파일의 캡슐화 된 bash가 있습니다.

그런 다음 대상 맵으로 추출

filepack -y  

소스 맵이 만들어 질 곳 -y(항상 수락, 덮어 쓰기, 건너 뛰기 등)

그런 다음 파일 팩을 대상 영역으로 scp ftp하여 가능한 경우 실행할 수 있습니다.


1
Arj? 80 년대에 죽지 않았습니까?
Michael Hampton

아마 위키피디아를 믿는다면 90 년대 초반
Matt

0

적용 할 수있는 몇 가지 속도 향상이 있습니다 rsync.

기피

  • -z/ --compress: 압축은 네트워크가 아니라 RAM을 통해 전송되므로 CPU 만로드합니다.
  • --append-verify: 중단 된 전송을 재개합니다. 좋은 생각처럼 들리지만 위험한 실패 사례가 있습니다. 소스와 크기가 같거나 큰 대상 파일은 무시됩니다. 또한 마지막에 전체 파일을 체크섬 --no-whole-file하므로 위험한 실패 사례를 추가하는 동안 속도가 크게 향상되지 않습니다 .

사용하다

  • -S/ --sparse: null 시퀀스를 희소 블록으로 변환
  • --partial또는 다음 -P중 하나입니다 --partial --progress. 나중에 다시 시작하기 위해 부분적으로 전송 된 파일을 저장하십시오. 참고 : 파일 이름은 임시 이름이 아니므로 전체 사본이 완료 될 때까지 대상을 사용할 것으로 예상되지 않도록하십시오.
  • --no-whole-file다시 보내야하는 것은 델타 전송을 사용합니다. 부분적으로 전송 된 파일의 절반을 읽는 것이 다시 쓰는 것보다 훨씬 빠릅니다.
  • --inplace 파일 복사를 피하기 위해 (그러나 전체 전송이 완료 될 때까지 대상을 읽는 것이없는 경우에만)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.