Tiếp tục quá trình sao chép bị gián đoạn


8

Làm thế nào để tiếp tục quá trình sao chép tập tin một cách an toàn và đáng tin cậy $Avào vị trí sao lưu $Bđược thực hiện với pv "$A" > "$B"hoặc cat "$A" > "$B"?

(giả sử tệp $Arất lớn, ví dụ: tệp chụp nhanh LVM2)

Có thể đạt được với dd?

Preffered: giải pháp bash hoặc python (tốt nhất là python3).

Kịch bản ví dụ: pv "$A" > "$B"bị gián đoạn sau khi sao chép 90%. Làm thế nào để tiếp tục nó, để kết thúc quá trình sao chép nhưng không lặp lại toàn bộ công việc một lần nữa?


Câu trả lời:


12

Có bạn có thể sử dụng dd để bỏ qua các khối.

A="file1"
B="file2"

BLOCKSIZE=512  # default bs for dd

size_b=$(stat -c "%s" "$B")
skip_blocks=$((size_b / BLOCKSIZE))

dd if="$A" of="$B" skip=$skip_blocks seek=$skip_blocks bs=$BLOCKSIZE

Các thông số quan trọng ở đây skipcũng như seek:

  • skip: bỏ qua các khối có kích thước ibs BLOCK khi bắt đầu nhập
  • seek: bỏ qua các khối có kích thước quan sát BLOCKS khi bắt đầu xuất

10

Bạn muốn rsync:

rsync -a --append "$A" "$B"

1
Tôi không muốn sử dụng rsync. Giả sử A là 1TB và tôi đã sao chép 900GB dữ liệu và còn lại 100G. rsync sẽ đọc toàn bộ 1TB, trong khi tôi chỉ cần 100G cuối cùng! -> Đọc đầu tiên về thuật toán được sử dụng: en.wikipedia.org/wiki/Rsync#Alacticm
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki Tôi nghĩ bạn đã sai. Trừ khi trải nghiệm của tôi với rsync là hoàn toàn sai, rsync sẽ đọc những gì nó cần đọc để xác minh đầu ra là đúng, cho đến khi nó đạt đến điểm bắt đầu xuất hiện chênh lệch, và sau đó nó sẽ tiếp tục từ điểm được đánh dấu đó. Điều này có vẻ là khá nhiều chính xác những gì cần thiết.
killermist

1
Để làm việc này bạn cũng cần thêm --append.
Thor

Cảm ơn @Thor đã nhấn mạnh tùy chọn này. Khi tôi kiểm tra lại, có vẻ như hành vi của --appendđã thay đổi kể từ phiên bản 3.0.0. Bạn có thể đảm bảo cho tôi nếu hiện tại --appendbỏ qua phần đã được sao chép, trong khi --append-verifyđọc toàn bộ A để kiểm tra tổng kiểm tra? (trước phiên bản 3.0.0. --appendcư xử như --append-verify-> Đó là lý do của sự hiểu lầm)
Grzegorz Wierzowiecki

5
@GrzegorzWierzowiecki: Tôi đã không nhận thấy sự thay đổi này. Tôi vừa kiểm tra nó, và thực sự --appendgắn vào tập tin một cách mù quáng. --append-verifythực hiện tương tự nhưng chạy tổng kiểm tra ở cuối, nếu tổng kiểm không khớp rsyncdường như làm một bản sao mới.
Thor

3

Bạn đã thử dd skipvới độ lệch của kích thước tệp thực của B (không phụ thuộc vào kích thước khối phân vùng) chưa?

Điều đó sẽ giúp bạn có phần còn thiếu. Tại thời điểm đó, bạn có thể trực tiếp catchúng cùng nhau thành một tệp mới với cat "$B" "$A2" >> "$C"; #mv "$C" "$B"( $Ctất nhiên là phần còn thiếu trên một đường dẫn có đủ không gian).

catcũng hoạt động tốt đối với các nhị phân nối và trong trường hợp này, bạn không có nhiều tiêu đề tệp sẽ có trước các phép hợp nhất theo kịch bản đơn giản. Có khả năng phần cuối $Bbị hỏng, nhưng trong trường hợp đó bạn có thể cắt ngắn và đọc lại nhiều hơn $Atrong bước dd ban đầu.

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.