Sao chép một cây thư mục lớn cục bộ? cp hay rsync?


230

Tôi phải sao chép một cây thư mục lớn, khoảng 1,8 TB. Đó là tất cả địa phương. Theo thói quen tôi sẽ sử dụng rsync, tuy nhiên tôi tự hỏi liệu có nhiều điểm không, và liệu tôi có nên sử dụng không cp.

Tôi lo lắng về quyền và uid / gid, vì chúng phải được giữ trong bản sao (tôi biết rsync làm điều này). Cũng như những thứ như symlink.

Đích đến trống, vì vậy tôi không phải lo lắng về việc cập nhật có điều kiện một số tệp. Đó là tất cả đĩa cục bộ, vì vậy tôi không phải lo lắng về ssh hoặc mạng.

Lý do tôi bị cám dỗ khỏi rsync, là vì rsync có thể làm nhiều hơn tôi cần. tập tin tổng kiểm tra rsync. Tôi không cần điều đó, và lo ngại rằng nó có thể mất nhiều thời gian hơn cp.

Vì vậy, những gì bạn nghĩ, rsynchoặc cp?


2
Nếu rsync thực hiện chính xác những gì bạn muốn nó làm, nếu bạn đã khá quen thuộc với việc sử dụng nó cho ứng dụng cụ thể này và nếu nó hoạt động đủ nhanh để phù hợp với sở thích của bạn, vậy thì tại sao bạn lại muốn chuyển đổi?
eleven81

2
Bởi vì tôi lo ngại rằng rsync sẽ mất nhiều thời gian hơn cp, vì rsync thực hiện nhiều thao tác kiểm tra mà cp sẽ không làm
Rory

1
Tổng chi phí cpu của tổng kiểm tra là nhỏ so với i / o của đĩa / mạng. Trừ khi đĩa nằm trên cùng một hệ thống và HĐH có thể thực hiện một số bản sao ổ đĩa thông minh trong bộ điều khiển bus.
Martin Beckett

3
Kiểm tra được thực hiện trên các tệp khác nhau ở kích thước và kiểm tra dấu thời gian. Nếu bạn bị hoang tưởng (như sau khi mất điện trong khi sao chép), bạn có thể buộc kiểm tra tất cả các tệp, nhưng trên một lần chuyển cục bộ, điều đó thường chậm hơn so với bắt đầu từ đầu.
korkman

3
Có lẽ anh ấy tò mò về việc cải thiện quy trình làm việc của mình, và không vùi đầu vào cát nghĩ rằng anh ấy biết tất cả mọi thứ. Nhận xét này thực sự làm tôi khó chịu.
Martin Konecny

Câu trả lời:


204

Tôi sẽ sử dụng rsync vì điều đó có nghĩa là nếu nó bị gián đoạn vì bất kỳ lý do gì, thì bạn có thể khởi động lại nó dễ dàng với rất ít chi phí. Và là rsync, nó thậm chí có thể khởi động lại một phần thông qua một tệp lớn. Như những người khác đề cập, nó có thể loại trừ các tập tin dễ dàng. Cách đơn giản nhất để bảo tồn hầu hết mọi thứ là sử dụng -acờ - 'kho lưu trữ.' Vì thế:

rsync -a source dest

Mặc dù UID / GID và symlink được giữ nguyên bởi -a(xem -lpgo), câu hỏi của bạn ngụ ý rằng bạn có thể muốn có một bản sao đầy đủ của thông tin hệ thống tệp; và -akhông bao gồm khó liên kết, thuộc tính mở rộng, hoặc ACL (trên Linux) hoặc bên trên cũng không dĩa tài nguyên (trên OS X.) Như vậy, đối với một bản sao mạnh mẽ của một hệ thống tập tin, bạn sẽ cần phải bao gồm những lá cờ:

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

Cp mặc định sẽ bắt đầu lại, mặc dù -ucờ sẽ "chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu" . Và -acờ (lưu trữ) sẽ được đệ quy, không phải tệp recopy nếu bạn phải khởi động lại và giữ quyền. Vì thế:

cp -au source dest

5
Cờ -u của cp có lẽ không phải là giải pháp tốt nhất, vì nó sẽ không phát hiện ra một tệp bị sao chép / bị hỏng một phần. Điều thú vị về rsync là bạn có thể lấy nó md5 tổng hợp các tệp để phát hiện sự khác biệt.
Chad Huneycutt

3
Thêm tùy chọn -w (--whole-file) sẽ tăng tốc rsync bị gián đoạn, vì nó sẽ chỉ sao chép tệp thay vì kiểm tra.
hayalci

13
trên thực tế, rsync phát hiện chuyển cục bộ và cho phép sao chép toàn bộ tệp mà không cần kiểm tra tự động.
korkman

22
và - tiến hành thực sự tiện dụng!
Matt

12
-P hoặc --prowards hiển thị tiến trình cho từng tệp riêng lẻ. Nó hữu ích để sao chép các tệp lớn, không phải cho nhiều (hàng nghìn) tệp nhỏ vì điều đó có nghĩa là đầu ra nhiều hơn mà bạn không thể đọc. Nó không hiển thị tiến trình quá mức của tất cả các tệp kết hợp.
XUÂN

106

Khi sao chép vào hệ thống tệp cục bộ, tôi luôn sử dụng các tùy chọn rsync sau:

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

Đây là lý do của tôi:

-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)

Tôi đã thấy chuyển khoản nhanh hơn 17% bằng cách sử dụng cài đặt rsync ở trên qua lệnh tar sau như được đề xuất bởi câu trả lời khác:

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

1
Tôi đang gặp lỗi sau: rsync: --no-compress: unknown option@Ellis Percival.
alper

Đây là ánh sáng nhanh. Nhanh hơn để làm điều này hơn rm -rf /src/.
dgo

2
Giống như @alper, --no-nén không phải là một tùy chọn cho phiên bản rsync của tôi (trong CentOS 7); Tôi đã sử dụng --compress-level = 0 thay thế.
Paul

79

Khi tôi phải sao chép một lượng lớn dữ liệu, tôi thường sử dụng kết hợp tar và rsync. Vượt qua đầu tiên là tar nó, một cái gì đó như thế này:

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

Thông thường với một số lượng lớn các tệp, sẽ có một số tar không thể xử lý vì bất kỳ lý do gì. Hoặc có thể quá trình sẽ bị gián đoạn hoặc nếu đó là di chuyển hệ thống tệp, bạn có thể muốn thực hiện sao chép ban đầu trước bước di chuyển thực tế. Ở bất kỳ giá nào, sau bản sao ban đầu, tôi thực hiện bước rsync để đồng bộ hóa tất cả:

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

Lưu ý rằng dấu gạch chéo trên /src/là quan trọng.


6
+1 Tôi đã tìm thấy tar thường nhanh hơn cho các bản sao lớn hơn rsync. Tôi cũng thích ý tưởng hoàn thiện với một rsync cuối cùng.
Geoff Fritz

2
tar là một lựa chọn tốt nếu số phận trống rỗng. Mặc dù cách của tôi sẽ là: cd $ DSTDIR; tar c -C $ SRCDIR. | tar
asdmin

19
Đó là vẻ đẹp của phương pháp này. Bạn không cần gấp đôi dung lượng vì bạn không bao giờ thực sự tạo một tệp tar trung gian. Tar trước ống dẫn dữ liệu và truyền dữ liệu đến thiết bị xuất chuẩn, và tar sau khi ống lấy nó từ stdin và giải nén nó.
Chad Huneycutt

4
Tôi đã thực hiện một cp -a cho chuyển 12gb, và phương pháp này cho chuyển 42gb. Phương pháp tar mất khoảng 1/4 thời gian.
NGaida

3
Tôi cũng đặt pvở giữa để có thể theo dõi tiến trình, ước tính kích thước của tất cả dữ liệu sử dụng df. Tôi cũng đã sử dụng --numeric-owner, vì đĩa nguồn là từ một hệ thống khác và tôi không muốn làm phiền tarcác chủ sở hữu:tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
Petr Pudlák

14

rsync

Đây là rsync tôi sử dụng, tôi thích cp cho các lệnh đơn giản, không phải cái này.

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

cpio

Đây là một cách thậm chí còn an toàn hơn, cpio. Nó nhanh như tar, có thể nhanh hơn một chút.

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

hắc ín

Điều này cũng tốt, và tiếp tục thất bại đọc.

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

Lưu ý rằng tất cả chỉ dành cho bản sao địa phương.


Tại sao bạn sử dụng cờ -S và -D cho rsync?
miyalys

7

Bất cứ thứ gì bạn thích. Chỉ cần đừng quên công -atắc khi bạn quyết định sử dụng cp.

Nếu bạn thực sự cần một câu trả lời: Tôi sẽ sử dụng rsync vì nó linh hoạt hơn nhiều. Cần tắt máy trước khi sao chép hoàn tất? Chỉ cần ctrl-c và tiếp tục ngay sau khi trở lại. Cần loại trừ một số tập tin? Chỉ cần sử dụng --exclude-from. Cần thay đổi quyền sở hữu hoặc quyền? rsync sẽ làm điều đó cho bạn.


Cờ -p làm gì nữa?
Rory

1
Nó sẽ bảo vệ quyền sở hữu, dấu thời gian và quyền.
innaM

5
cp -a sẽ tốt hơn
David Pashley

Thật. Trả lời thay đổi cho phù hợp.
innaM

7

Các rsynclệnh luôn luôn tính toán tổng kiểm tra trên tất cả các byte nó chuyển.

Tùy chọn dòng lệnh --checksumchỉ liên quan đến việc tổng kiểm tra các tệp có được sử dụng để xác định tệp nào sẽ chuyển hay không, tức là:

-c, --checksum bỏ qua dựa trên tổng kiểm tra, không phải thời gian và kích thước "

Trang này cũng nói điều này:

Lưu ý rằng rsync luôn xác minh rằng mỗi tệp được chuyển đã được xây dựng lại một cách chính xác ở phía bên nhận bằng cách kiểm tra tổng kiểm tra toàn bộ tệp của nó, nhưng xác minh sau khi chuyển tự động không liên quan gì đến tùy chọn này trước khi chuyển " để được cập nhật? " kiểm tra.

Vì vậy rsync, luôn luôn, tính toán tổng kiểm tra của toàn bộ tệp ở phía bên nhận, ngay cả khi -c/ --checksumtùy chọn bị "tắt".


14
Trong khi bài đăng của bạn đã thêm một số thông tin thú vị ở đây, những lời tán dương và lăng mạ làm giảm giá trị bài đăng của bạn. Trang web này không phải là một diễn đàn cho những người không có tính xây dựng. Nếu bạn có thể sửa đổi nguồn, bạn đã gửi các sửa đổi của mình dưới dạng bản vá chưa? Bạn đã đăng phiên bản của mình trên github hay gì chưa? Nếu bạn cảm thấy mạnh mẽ về điều này, có thể tốt hơn nếu bạn cố gắng làm một cái gì đó mang tính xây dựng hơn một chút thay vì xúc phạm không cần thiết.
Zoredache

Vâng, đoạn cuối không thực sự cần thiết.
Chuyến bay của Sherwin

6

rsync -aPhW --protocol=28giúp tăng tốc những bản sao lớn đó với RSYNC. Tôi luôn đi rsync bởi vì suy nghĩ về giữa chừng 90GiB và nó phá vỡ sự sợ hãi của tôi khỏi CP


2
Giá trị của việc sử dụng giao thức cũ hơn trong chuỗi lệnh đó là gì?
ewwhite

1
Trên máy mac, phiên bản cũ hơn của Rupync được gửi bị treo trên một số vòng quay giao thức rsync mới hơn như 29. Việc nói với nó để chuyển sang giao thức cũ hơn khiến nó KHÔNG kiểm tra lại nhiều lần.
oneguynick

Tôi đoán rằng số 28 không còn giá trị nữa?
XUÂN

5

rsync là tuyệt vời, nhưng có vấn đề với cây thư mục thực sự lớn vì nó lưu trữ cây trong bộ nhớ. Tôi chỉ tìm kiếm xem họ có khắc phục được sự cố này không khi tôi tìm thấy chủ đề này.

Tôi cũng tìm thấy:

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

Bạn cũng có thể tự ngắt cây và chạy nhiều rsyncs.


12
Nếu bạn sử dụng phiên bản 3, nó sẽ không giữ toàn bộ cây trong bộ nhớ nếu nó lớn, nó sử dụng thuật toán đệ quy gia tăng: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Chủ đề này rất hữu ích và vì có rất nhiều lựa chọn để đạt được kết quả, tôi quyết định chấm điểm vài trong số chúng. Tôi tin rằng kết quả của tôi có thể hữu ích cho những người khác có ý thức về những gì làm việc nhanh hơn.

Để di chuyển 532Gb dữ liệu được phân phối trong số 1.753.200 tệp, chúng tôi đã có những thời gian đó:

  • rsync mất 232 phút
  • tar mất 206 phút
  • cpio mất 225 phút
  • rsync + parallel mất 209 phút

Trong trường hợp của tôi, tôi thích sử dụng rsync + parallel. Tôi hy vọng thông tin này sẽ giúp nhiều người quyết định trong số các lựa chọn thay thế này.

Điểm chuẩn hoàn chỉnh được công bố tại đây


Không tìm thấy trang 404
Amedee Van Gasse

1
Cảm ơn URL @AmedeeVanGasse đã được sửa một thời gian ngắn sau khi bạn báo cáo :)
arjones

Tại sao không điểm chuẩn cp? Đây là tiêu đề của câu hỏi!
calandoa

@calandoa Tôi nghĩ cplà không an toàn, tức là: khi nó bị hỏng bạn phải bắt đầu lại, đó là cách tôi ủng hộ các lựa chọn có thể tiếp tục, ergo rsynclà sở thích của tôi :)
arjones

3

Khi thực hiện một bản sao thư mục cục bộ, kinh nghiệm của tôi là "cp -van src Dest" nhanh hơn 20% so với rsync. Theo như khả năng khởi động lại, đó là những gì "-n" làm. Bạn chỉ cần rm các tập tin sao chép một phần. Không đau trừ khi đó là ISO hoặc một số như vậy.


2

ARJ LÀ TRƯỜNG HỌC C OLNG !! Tôi thực sự nghi ngờ rằng ARJ và / hoặc rsync sẽ mang lại hiệu suất.

Chắc chắn những gì tôi luôn làm là sử dụng cpio:

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

Điều này gần như nhanh hơn CP, chắc chắn nhanh hơn tar và không có bất cứ điều gì.


2
"Các cpio ban đầu và các tiện ích tìm kiếm được viết bởi Dick Haight khi làm việc trong Nhóm hỗ trợ Unix của AT & T. Chúng xuất hiện lần đầu tiên vào năm 1977 trong PWB / UNIX 1.0" - cpiotrang người dùng của FreeBSD .
Chris S

3
cpiokhông may có giới hạn trên 8GB cho các tệp.

"Không có ống bất cứ điều gì " [sic]. Ngoại trừ findlệnh, như bạn đã liệt kê, có một đường ống trong đó:find . -print | cpio -pdm /target/folder
warren

1

Bạn chắc chắn muốn từ bỏ rclone một thử. Điều này thật điên rồ:

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

Đây là bản sao cục bộ từ và sang SSD LITEONIT LCS-256 (256GB).

Bạn có thể thêm --ignore-checksumvào lần chạy đầu tiên để làm cho nó nhanh hơn nữa.



0

tar cũng sẽ thực hiện công việc, nhưng sẽ không tiếp tục bị gián đoạn như rsync.


Một câu trả lời cũ, nhưng không phải là TAR để tạo tệp lưu trữ nén? Làm thế nào nó có thể được sử dụng để chuyển các tập tin như rsync hoặc cp?
Chuyến bay của Sherwin

@SherwinFlight nguồn cd; tar cf -. | (cd mệnh; tar xf -)
pss

0

Nếu bạn sử dụng ARJ thì sao?

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

nơi -jm -m1có mức nén và -jelàm cho nó có thể thực thi được. Bây giờ bạn có một bash tập tin đóng gói.

Sau đó để trích xuất vào bản đồ đích

filepack -y  

nơi bản đồ nguồn sẽ được tạo (nơi -yluôn được chấp nhận, ghi đè, bỏ qua, v.v.)

Sau đó, người ta có thể scp ftp filepack đến khu vực đích và thực hiện nó, nếu điều đó là có thể.


1
Arj? Chẳng phải điều đó đã chết trong những năm 80 sao?
Michael Hampton

có thể là đầu những năm 90 nếu bạn tin wikipedia
Matt

0

Có một số tăng tốc có thể được áp dụng cho rsync:

Tránh

  • -z/ --compress: nén sẽ chỉ tải lên CPU vì quá trình truyền không qua mạng mà qua RAM.
  • --append-verify: tiếp tục chuyển khoản bị gián đoạn. Điều này nghe có vẻ là một ý tưởng tốt, nhưng nó có trường hợp thất bại nguy hiểm: bất kỳ tệp đích nào có cùng kích thước (hoặc lớn hơn) so với nguồn sẽ được IGNORED. Ngoài ra, nó kiểm tra toàn bộ tập tin ở cuối, có nghĩa là không tăng tốc đáng kể --no-whole-filetrong khi thêm trường hợp thất bại nguy hiểm.

Sử dụng

  • -S/ --sparse: biến chuỗi null thành các khối thưa thớt
  • --partialhoặc -Pđó là --partial --progress: lưu bất kỳ tập tin được chuyển một phần nào để tiếp tục trong tương lai. Lưu ý: các tệp sẽ không có tên tạm thời, vì vậy hãy đảm bảo rằng không có gì khác mong đợi sử dụng đích cho đến khi toàn bộ bản sao hoàn thành.
  • --no-whole-fileđể bất cứ điều gì cần phải bực bội đều sử dụng chuyển delta. Đọc một nửa tệp được chuyển một phần thường nhanh hơn nhiều so với viết lại.
  • --inplace để tránh sao chép tệp (nhưng chỉ khi không có gì đang đọc đích cho đến khi toàn bộ quá trình chuyển hoàn thành)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.