Làm thế nào để so sánh sự khác biệt giữa các thư mục (linux)


24

Tôi có hai thư mục - một từ bản sao lưu trước và thứ hai từ bản sao lưu mới nhất. Làm cách nào để so sánh những thay đổi đã được thực hiện đối với các tệp trong thư mục từ bản sao lưu mới nhất trên Linux? Ngoài ra, làm cách nào để hiển thị các thay đổi trong ví dụ tệp văn bản và tệp php - tôi đang suy nghĩ về một cái gì đó như lịch sử sửa đổi trên wikipedia nơi bạn thấy phiên bản cũ ở một bên của màn hình và phiên bản mới nhất ở bên kia và các thay đổi được tô sáng. Làm thế nào để tôi đạt được một cái gì đó như thế?

chỉnh sửa: Làm thế nào để tôi cũng so sánh dir từ xa với địa phương?

Câu trả lời:


35

Từ trang diff man:

Nếu cả từ tệp và tệp đến là thư mục, diff sẽ so sánh các tệp tương ứng trong cả hai thư mục, theo thứ tự bảng chữ cái; so sánh này không được đệ quy trừ khi tùy chọn -r hoặc --recursive được đưa ra. diff không bao giờ so sánh nội dung thực tế của một thư mục như thể nó là một tập tin. Tệp được chỉ định đầy đủ có thể không phải là đầu vào tiêu chuẩn, vì đầu vào tiêu chuẩn là không tên và khái niệm '' tệp có cùng tên '' không áp dụng.

Vì vậy, để so sánh các thư mục: diff --brief -r dir1 dir2

Để so sánh các tệp cạnh nhau: diff --side-by-side file1 file2


rất tuyệt, tôi sẽ thử nó
Phil

... tôi tự hỏi làm thế nào để tôi so sánh thư mục từ xa với địa phương?
Phil

1
Bạn sẽ phải gắn thư mục từ xa vào máy cục bộ. Tuy nhiên, bạn có thể so sánh từ xa các tệp như vậy: ssh REMOTE_SERVER "cat / path / to / some / file" | diff --side-by-side / path-to-some-file - Một điều khác, lệnh 'sdiff' hoạt động như 'diff - side-by-side' nếu bạn muốn lưu một số thao tác gõ.
Sean Staats

2
Sử dụng NFS để gắn thư mục từ xa. Trên máy chủ từ xa (máy chủ-b), chỉnh sửa / etc / export và đặt phần sau vào đó: / path / of / thư mục / to / share server-a.ip.address (ro, no_root_squash) Bắt đầu NFS trên máy chủ-b (/etc/init.d/nfs start) Gắn kết với máy chủ cục bộ của bạn (máy chủ-a) bằng cách thêm dòng sau vào / etc / fstab: server-b.ip.add: / path / of / thư mục / to / share / mnt / server-b nfs rsize = 32768, wsize = 32768, rw 0 0 Sau đó, trên máy chủ-a, mkdir / mnt / server-b; mount / mnt / server-b Cảm ơn các upvote.
Sean Staats

2
Bạn có thể sử dụng sshfsđể tạo một thư mục nối mạng tạm thời đặc biệt, thay vì sử dụng NFS.
Dan Andreatta

3

Giả định:

  • chúng tôi đang trên www1, so sánh với điều khiển từ xawww2
  • Có xác thực Khóa công khai từ cục bộ www1đến từ xawww2
  • chúng tôi so sánh như cùng một người dùng trên địa phương www1và từ xawww2
tìm / var / www / html / -name "*" -exec md5sum -b {} \; | grep -v "/ var / www / html / Elim_this dir"> local.md5
ssh www2 "find / var / www / html / -name '*' -exec md5sum -b {} \; | grep -v / var / www / html / Elim_this dir> remote.md5"
scp www2: từ xa.md5.
diff local.md5 remote.md5 

3

Bạn thực sự muốn kết hợp sức mạnh của rsyncviệc giảm tiêu thụ băng thông với sức mạnh của diffviệc cung cấp cho bạn sự khác biệt linh hoạt, tốt.

Vì vậy, một cái gì đó như thế này:

cp -R $local $bak
rsync $server:$remdir/* $local/
rsync $local/ $server:$remdir/* 
diff -wur $local $bak

Tôi đoán bạn có thể điều chỉnh điều này một chút nếu bạn đang thực hiện nó thường sử dụng rsyncthay vì cpở dòng đầu tiên - rõ ràng ở dòng cuối cùng bạn có toàn quyền diffđịnh dạng nó theo cách bạn muốn. Có lẽ với y trong trường hợp OP

Nhược điểm của phương pháp này là bạn sẽ sử dụng gấp đôi không gian cục bộ, nhưng với mức giá dưới 1 đô la / gig thì ai quan tâm?


cp --reflink=auto --sparse=alwaysđể không sử dụng không gian cho bản sao tùy thuộc vào FS cơ bản.
Tom Hale

1

Làm diff old_dir new_dir > diff.txtcho sự khác biệt bên cạnh trên cùng một máy chủ.

Đối với các tệp từ xa:

Ví dụ: ABC là máy chủ hiện có và XYZ là máy chủ từ xa và tên thư mục của bạn là 123.

Bước 1: Đổi tên thư mục 123 hiện có trên Máy chủ ABC thành 123_ABC.

ABC:/Home > mv 123 123_ABC

Bước 2: Tạo một thư mục mới trên máy chủ ABC:

ABC: > mkdir 123_XYZ

Bước 3: Sao chép tất cả các tệp từ thư mục 123 trên máy chủ XYZ ​​sang thư mục 123_XYZ trên máy chủ ABC:

XYZ/123 > scp * userid@ABC: /123_XYZ

Điều này sẽ sao chép tất cả các tệp từ thư mục trên máy chủ XYZ ​​của bạn vào thư mục máy chủ ABC / 123_XYZ của bạn.

Bước: 4: Thực hiện khác biệt giữa cả hai thư mục:

Bây giờ hãy đến máy chủ ABC và thực hiện tìm khác nhau giữa 123_ABC và 123_XYZ

ABC > diff 123_ABC 123_XYZ > diff.txt

Lệnh trên sẽ lưu kết quả tìm khác biệt vào diff.txt trong cùng một đường dẫn.

Bạn có thể so sánh sự khác biệt sau đó.

Cảm ơn bạn,

Mehul


0

Môi trường phát hiện xâm nhập nâng cao AIDE (AIDE) là trình kiểm tra tính toàn vẹn tệp cho các hệ điều hành UNIX. Mục đích của nó là cung cấp báo cáo về tính toàn vẹn của dữ liệu trên các hệ thống tệp được hỗ trợ. Bằng cách chạy AIDE nhiều lần trên máy chủ đích, bạn có thể xác định tệp nào đang thay đổi. Bằng cách chạy AIDE nhiều lần trên các máy chủ khác nhau, bạn có thể xác định tệp và quyền nào khác nhau. Sau đó sử dụng một công cụ khác biệt gui trên các tệp "khác nhau" được báo cáo.

Hoặc sử dụng một công cụ khác của gui như meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff hoặc xxdiff. Hầu hết sẽ làm khác biệt thư mục ngoài các khác biệt tập tin. Bạn sẽ cần phải gắn ổ đĩa từ xa bằng NFS, SMBFS hoặc SSHFS như những người khác đã đề cập.


0

Hoặc bạn có thể sử dụng hai tệp với danh sách các tệp. Và sau đó so sánh hai tập tin đó. Ví dụ:

/path/to/compare/remote$: ls > remote-files 

/path/to/compare/local$: ls > local-files 

Tải về một trong các tập tin.

-rw-r - r-- 1 1015 1015 26624 2005-06-14 13:10 TẬP TIN.TXT  

đến FILE.TXT

Sử dụng diff ( diff -y remote-files local-files > diff-files) để so sánh chúng cạnh nhau. Mở các tập tin khác và kiểm tra nó. Mỗi dòng có> có nghĩa là một tệp khác nhau.

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.