Làm cách nào để lưu tập tin đã thay đổi?


8

Tôi có hai thư mục:

  • NGUYÊN/
  • ORIGINAL_AND_MY_CHANGES /

Bạn tôi có một bản sao GỐC /. Tôi muốn tạo MY_CHANGES.tgz - nó chỉ nên chứa các tệp mới / đã thay đổi từ ORIGINAL_AND_MY_CHANGES / so sánh với ORIGINAL /. Vì vậy, bạn tôi có thể giải nén nó vào bản sao ORIGINAL / của mình và nhận ORIGINAL_AND_MY_CHANGES /. Tôi có thể làm cái này như thế nào?

PS Tôi đã thử diffnhưng nó không thể lưu dữ liệu nhị phân và rsync --link-dest- nó tạo ra các liên kết cứng vô dụng trong kho lưu trữ.

PPS Trong trường hợp sửa đổi thời gian của tôi không thể được sử dụng để quyết định tập tin nào đã được thay đổi.


1
Bạn đã xem Directory Directory diff chưa? câu hỏi?
rozcietrzewiacz

Câu trả lời:


7

Với rsync

Những gì bạn đang làm về cơ bản là một bản sao lưu gia tăng: bạn của bạn (bản sao lưu của bạn) đã có các tệp gốc và bạn muốn tạo một kho lưu trữ chứa các tệp bạn đã thay đổi từ bản gốc đó.

Rsync có các tính năng để sao lưu gia tăng.

cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
  • -a có nghĩa là bảo tồn tất cả các thuộc tính (thời gian, quyền sở hữu, v.v.).
  • -c có nghĩa là so sánh nội dung tập tin và không dựa vào ngày và kích thước.
  • --compare-dest=/some/directorycó nghĩa là các tệp giống hệt nhau trong thư mục đó và cây nguồn không được sao chép. Lưu ý rằng đường dẫn có liên quan đến thư mục đích.

Rsync sao chép tất cả các thư mục, ngay cả khi không có tệp nào kết thúc ở đó. Để loại bỏ các thư mục trống này, hãy chạy find -depth CHANGES_ONLY -type d -empty -delete(hoặc nếu bạn findkhông có -delete-emptychạy find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null).

Sau đó thực hiện lưu trữ từ CHANGES_ONLYthư mục.

Đường dành cho người đi bộ

Đi qua thư mục với tập tin của bạn. Bỏ qua các tập tin giống hệt với bản gốc. Tạo thư mục trong mục tiêu khi cần thiết. Sao chép tập tin đã thay đổi.

cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
  for x; do
    if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
    [ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
    cp -p "$x" "../CHANGES_ONLY/$x"
  done
' {} +

Nó thậm chí còn là giải pháp tốt hơn so với enzotib vì tôi có thể đặt MY_CHANGES trong kiểm soát nguồn và cập nhật / theo dõi những thay đổi này (nếu tôi cập nhật tệp bó của rsync dưới sự kiểm soát nguồn thì sẽ không thể xem tệp nào đã được thay đổi)
Dmitry

@Dmitry Nếu bạn đang sử dụng kiểm soát nguồn, tại sao không đặt nhập / theo dõi ORIGINALvà tạo ORIGINAL_AND_MY_CHANGESchi nhánh? Sau đó tìm ra CHANGESvới một lệnh scm.
Gilles 'SO- ngừng trở nên xấu xa'

Trong trường hợp của tôi, ORIGINALđó là nguồn nền tảng Android (3GB, 126000 tệp). Ngay cả khi chạy rsync cũng mất ~ 15-20 phút. Tôi nghĩ rằng việc thêm tất cả những thứ này dưới sự kiểm soát nguồn sẽ tốn quá nhiều không gian và thời gian.
Dmitry

@Dmitry Điều đó giải quyết nó sau đó. Nếu đó là nguồn Android, hãy sử dụng repo và git. Làm việc trên chi nhánh của riêng bạn. Thật khó để quản lý những người có kiểm soát phiên bản, tôi rùng mình khi nghĩ nó sẽ như thế nào nếu không có nó. May mắn thay, git rất giỏi trong việc quản lý các chi nhánh địa phương.
Gilles 'SO- ngừng trở nên xấu xa'

Thật không may, đó là một nguồn Android tùy chỉnh mà không có bất kỳ kho lưu trữ repo / git nào trong đó.
Dmitry

5

Lệnh

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

sẽ tạo ra một TẬP TIN hàng loạt có chứa các thay đổi cần thiết (mà không sửa đổi bất cứ điều gì).

Bản vá có thể được áp dụng trên một trang web khác, nơi bạn lấy FILE hàng loạt, với

rsync --read-batch=FILE ORIGINAL/
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.