Bỏ qua các kết thúc dòng khi sử dụng Rsync


4

Tôi muốn đồng bộ hai thư mục. Cái đầu tiên có CRLFvà kết thúc dòng bình thường, thư mục thứ hai cũng có các tệp có CRLFvà kết thúc dòng bình thường.

Vấn đề là, khi tôi thực thi mã này:

  rsync -azr --exclude=images --dry-run --delete --checksum --out-format="/%f" /dir1 /dir2

Nó cho thấy rất nhiều tệp giống hệt nhau nhưng với mã hóa khác nhau sẽ được đồng bộ hóa và tôi chỉ muốn đồng bộ hóa các tệp nội dung khác nhau.

Với diff, có thể làm điều này:

diff --strip-trailing-cr file1 file2

Nhưng tôi không thể tìm thấy bất cứ điều gì như thế này cho Rupync. Làm cách nào tôi chỉ có thể đồng bộ hóa các tệp với nội dung khác nhau?


1
Bạn có thể vệ sinh các tập tin trong cả hai thư mục?
Kamil Maciorowski

Chào mừng bạn đến với Siêu người dùng Sergio! Một câu hỏi thú vị - Tôi đã chỉnh sửa nó để làm cho cụm từ và định dạng được sắp xếp hợp lý hơn, thoải mái quay lại nếu bạn thích :)
bertieb

Câu trả lời:


5

Không có tùy chọn để bỏ qua kết thúc dòng cho rsync

Như bạn đã tìm ra, rsynccoi các tệp có kết thúc dòng khác nhau là khác nhau. Điều này là bất tiện trong tình huống của bạn vì các tệp giống nhau về mặt trực quan / ngữ nghĩa.

rsyncquyết định những gì để đồng bộ hóa trong một tập tin dựa trên tổng kiểm tra trên các khối. Có một cái nhìn tổng quan về điều này :

(T) phiên bản cũ của tệp được chia thành các khối, ví dụ 1024 hoặc 2048 byte và tổng kiểm tra được tính cho mỗi khối.

Sau đó, tệp mới được tìm kiếm byte cho các khối với tổng kiểm tra khớp với các khối trong phiên bản cũ. Đây là một sơ đồ minh họa quá trình này:

khác 1

Lặp lại các thao tác này trên phiên bản mới của tệp bạn sẽ lặp qua byte tệp cho byte. Trong quá trình lặp này, bạn sẽ tìm thấy hai loại dữ liệu trong tệp:

  • Các khối dữ liệu khớp với các khối trong tệp cũ.
  • Chuỗi các byte không phải là một phần của khối phù hợp.

Từ RSync - Phát hiện sự khác biệt về tệp của Jakob Jenkov .

Nếu bạn quan tâm, phần tiếp theo là trên tổng kiểm tra được sử dụng . Tuy nhiên, điểm chính của tổng kiểm tra là nó hoạt động trên các byte và các tệp của bạn có các byte khác nhau do các kết thúc dòng . Như vậy, rsynclà phát hiện chính xác rằng chúng khác nhau và do đó đang chuyển chúng.

Tránh chuyển các tệp có kết thúc dòng khác nhau bằng cách vệ sinh trước khi chuyển

Cách tốt nhất để làm điều này là đảm bảo tất cả các tệp của bạn có kết thúc dòng nhất quán hoặc vệ sinh chúng, như Kamil đề xuất trong các bình luận.

Làm thế nào bạn làm điều này là tùy thuộc vào bạn. Bạn có thể quyết định rằng bạn sẽ thực hiện thay đổi khi các tệp được tạo, chỉnh sửa hoặc cập nhật. Hoặc bạn có thể làm điều đó như một bước chuyển trước.

Chỉ áp dụng khử trùng cho các tập tin cần thiết

Nếu bạn vệ sinh, hãy chắc chắn rằng bạn không áp dụng nó một cách mù quáng , vì Kamil cảnh báo thêm:

Không nên sử dụng bất kỳ công cụ chuyển đổi nào một cách mù quáng trên tất cả các tệp. Ngay cả khi công cụ cố gắng đoán xem một tệp là văn bản hay nhị phân, thì đó chỉ là heuristic. CRLF có thể xuất hiện bên trong tệp nhị phân; các khối trông giống như văn bản cũng có thể xuất hiện. Sửa đổi một tệp nhị phân bằng cách loại bỏ một số byte có thể sẽ làm hỏng nó .

(nhấn mạnh của tôi)

Ví dụ: nếu bạn có các tệp trong hai thư mục mà bạn biết là các tệp văn bản cần được khử trùng, chỉ áp dụng bước khử trùng cho tập hợp con đó.

Tôi nên sử dụng công cụ nào để thay đổi kết thúc?

Một giải pháp đầy đủ nằm ngoài phạm vi của câu trả lời này. Có một vài gợi ý trên trên SO QA này , bao gồm dos2unix, tr, sed, awk, perl.

Ví dụ:

Bạn có thể sử dụng trđể chuyển đổi từ DOS sang Unix; tuy nhiên, bạn chỉ có thể thực hiện việc này một cách an toàn nếu CR chỉ xuất hiện trong tệp của bạn dưới dạng byte đầu tiên của cặp byte CRLF. Đây thường là trường hợp. Sau đó, bạn sử dụng:

tr -d '\015' <DOS-file >UNIX-file

Tuy nhiên, nếu bạn đang đi để có để làm điều này rất thường xuyên (nhiều hơn một lần, nói đại khái), nó còn lâu mới hợp lý hơn để cài đặt các chương trình chuyển đổi (ví dụ dos2unixunix2dos, hoặc có lẽ dtouutod) và sử dụng chúng.

từ câu trả lời của Jonathan Leffler .

Tuy nhiên, hãy ghi nhớ cảnh báo trên khi sử dụng bất kỳ công cụ nào trong số đó.


@KamilMaciorowski rất đúng; Tôi tránh xa việc đưa ra bất kỳ khuyến nghị cụ thể nào vì nó nằm ngoài phạm vi của câu hỏi này, không biết thiết lập của OP. Tôi sẽ cập nhật câu trả lời với cảnh báo của bạn quá, tuy nhiên.
bertieb

Người đàn ông trả lời tốt đẹp !!
Pimp Juice IT
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.