Tôi có thể đối diện với `diff -q` - khớp các tệp giống hệt nhau mà không in nội dung của chúng không


13

Tôi có một số tệp trong một thư mục và tôi muốn kiểm tra xem chúng có phải là duy nhất không. Để đơn giản, giả sử tôi có ba tập tin: foo.txt, bar.txtbaz.txt. Nếu tôi chạy vòng lặp này, tôi sẽ kiểm tra tất cả chúng với nhau:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Đối với hàng trăm tệp tôi muốn xử lý, điều này sẽ trở nên khá khó đọc; nó sẽ là tốt hơn để liệt kê các tập tin mà làm trận đấu, và sau đó tôi có thể nhìn qua danh sách một cách nhanh chóng và đảm bảo rằng tập tin được chỉ phù hợp với bản thân. Từ trang này, tôi đã nghĩ rằng -stùy chọn sẽ thực hiện điều này:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... tuy nhiên, trên thực tế, nó cũng in ra toàn bộ nội dung của bất kỳ tệp nào khác nhau. Có cách nào để ngăn chặn hành vi này, vì vậy tôi chỉ nhận được hành vi trên?

Ngoài ra, có một số công cụ khác có thể thực hiện điều này ?

Câu trả lời:


6

Nếu bạn chỉ muốn kiểm tra xem hai tập tin có giống nhau hay không, hãy sử dụng cmp. Để chỉ nhận đầu ra cho các tệp giống hệt nhau, bạn có thể sử dụng

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff cố gắng tạo ra một danh sách ngắn về sự khác biệt có thể đọc được của con người và điều này có thể mất khá nhiều thời gian, vì vậy hãy tránh chi phí nếu bạn không cần.


12

Cái này cần phải dùng mẹo:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

ở đâu dir1dir2là hai thư mục của bạn.

Nếu bạn chỉ muốn in các thư mục phù hợp từ dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

Và tương tự, nếu bạn muốn chỉ in các thư mục phù hợp từ dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn!
Joshua Soileau

Sử dụng diff -qrskhi so sánh các tệp lớn (yên lặng loại bỏ sự khác biệt in)
marcovtwout

4

Công cụ nhanh nhất được viết cho mục đích đó là fdupes (nó có sẵn trong các gói repos của Fedora và Ubuntu và Thẻ )

Sử dụng:

fdupes -r dir1 dir2

2

Nếu bạn cần tìm các tệp giống hệt nhau trong danh sách, trước tiên hãy sắp xếp chúng theo kích thước, ví dụ như với

ls -S

sau đó cho từng nhóm tệp có kích thước giống hệt nhau, chạy md5sumtrên chúng để xem dễ dàng giống hệt với tệp nào.

Đối với các tệp lớn, có thể nhanh hơn để kiểm tra lần đầu tiên chỉ một phần ngắn của toàn bộ tệp:

dd if=file bs=512 count=1 | md5sum

và sau đó thực hiện kiểm tra toàn bộ chỉ trên các tệp nghi ngờ.

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.