tra-loi-cau-hoi-phat-trien-web.com

Cho hai cây thư mục, làm thế nào tôi có thể tìm ra các tập tin khác nhau?

Nếu tôi muốn tìm sự khác biệt giữa hai cây thư mục, tôi thường chỉ thực hiện:

diff -r dir1/ dir2/

Điều này xuất ra chính xác sự khác biệt giữa các tập tin tương ứng. Tôi quan tâm đến việc nhận danh sách các tệp tương ứng có nội dung khác nhau. Tôi giả định rằng đây đơn giản chỉ là vấn đề chuyển một tùy chọn dòng lệnh cho diff, nhưng tôi không thể tìm thấy bất cứ điều gì trên trang man.

Bất kỳ đề xuất?

692
Mansoor Siddiqui

Bạn đã nói Linux, vì vậy bạn may mắn ra ngoài (ít nhất là nó nên có sẵn, không chắc chắn khi nó được thêm vào):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

Nên làm những gì bạn cần.

Nếu bạn cũng muốn thấy sự khác biệt cho các tệp có thể không tồn tại trong một trong hai thư mục:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
990
Mark Loeser

Lệnh tôi sử dụng là:

diff -qr dir1/ dir2/

Nó giống hệt như của Mark :) Nhưng câu trả lời của anh ấy làm tôi bực mình vì nó sử dụng các cờ loại khác nhau và nó khiến tôi nhìn hai lần. Sử dụng các cờ dài hơn của Mark sẽ là:

diff  --brief --recursive dir1/ dir2/

Tôi xin lỗi vì đã đăng bài khi câu trả lời khác là hoàn toàn chấp nhận được. Không thể dừng bản thân mình ... làm việc để trở nên ít phạm vi hơn.

279
FPC

Tôi thích sử dụng git diff --no-index dir1/ dir2/, vì nó có thể hiển thị sự khác biệt về màu sắc (nếu bạn có tùy chọn đó được đặt trong cấu hình git của mình) và vì nó hiển thị tất cả các khác biệt trong đầu ra phân trang dài bằng cách sử dụng "ít".

89
Alan Porter

Hai lệnh này về cơ bản là điều được yêu cầu:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

Sự lựa chọn giữa chúng phụ thuộc vào vị trí của dir1 và dir2:

Khi các thư mục nằm trên hai ổ đĩa riêng biệt, diff vượt trội hơn rsync. Nhưng khi hai thư mục được so sánh nằm trên cùng một ổ đĩa, rsync sẽ nhanh hơn. Đó là bởi vì diff đặt tải gần như bằng nhau cho cả hai thư mục song song, tối đa hóa tải trên hai ổ đĩa.

rsync tính toán tổng trong các khối lớn trước khi thực sự so sánh chúng. Điều đó nhóm các hoạt động i/o theo khối lớn và dẫn đến xử lý hiệu quả hơn khi mọi thứ diễn ra trên một ổ đĩa.

30
CodeBug

Meldcũng là một công cụ tuyệt vời để so sánh hai thư mục:

meld dir1/ dir2/

Meld có nhiều tùy chọn để so sánh các tập tin hoặc thư mục. Nếu hai tệp khác nhau, thật dễ dàng để vào chế độ so sánh tệp và xem sự khác biệt chính xác.

15
Alexander

Người đồng hương 'billings' (của freenode/# centos fame) đã chia sẻ phương pháp của anh ấy với tôi:

diff -Naur dir1/ dir2

Bao gồm cả thư mục cuối cùng dấu gạch chéo không thành vấn đề.

Ngoài ra, nó xuất hiện tùy chọn -u không có sẵn trên một số phiên bản máy chủ/máy chủ cũ hơn.

Sự khác biệt trong khác biệt:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
9
todd_dsm

Máy quang phổ là một công cụ tìm thư mục dựa trên dòng lệnh tuyệt vời.

Tôi đặc biệt thích về nó rằng nó có thể diff thành files:

Nó sẽ giải nén đệ quy các tài liệu lưu trữ thuộc nhiều loại và biến đổi các định dạng nhị phân khác nhau thành dạng dễ đọc hơn để so sánh chúng. Nó có thể so sánh hai tarball, hình ảnh ISO hoặc PDF một cách dễ dàng.

Nó sẽ không chỉ cho bạn biết các tập tin khác nhau, mà còn khác nhau như thế nào.

3
nh2

Để tìm diff sử dụng lệnh này:

diff -qr dir1/ dir2/

-r sẽ khác tất cả các thư mục con quá -q nói diff chỉ báo cáo khi các tệp khác nhau.

diff  --brief dir1/ dir2/

--brief sẽ hiển thị các tệp tồn tại trong thư mục.

Hoặc cái gì đó khác

chúng ta có thể sử dụng Meld sẽ hiển thị trong cửa sổ đồ họa để dễ dàng tìm thấy sự khác biệt.

meld  dir1/ dir2/
2
Javeed Shakeel

Bạn có thể cũng sử dụng Rsyncfind. Dành cho find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Nhưng các tệp có cùng tên và trong cùng một thư mục con, nhưng có nội dung khác nhau, sẽ không được hiển thị trong danh sách.

Nếu bạn là người hâm mộ GUI, bạn có thể kiểm tra Meld that @Alexander đã đề cập. Nó hoạt động tốt trong cả windows và linux.

0
Fábio