Tìm kiếm các bản sao tệp trong OSX bằng hàm băm


14

Tôi đang tìm cách để tìm kiếm một tệp xác định trong OSX (Maverick nhưng nói chung là OSX). Cụ thể, tôi muốn làm như sau:
đưa ra một File_001 Tôi muốn tìm kiếm nếu trong hệ thống tệp tồn tại một bản sao của tệp này.
Không chỉ có cùng tên, tôi muốn phương pháp so sánh là một thuật toán băm như MD5, SHA, v.v.

Hầu hết các "công cụ tìm tập tin trùng lặp" tôi đã thử chỉ tìm kiếm tất cả các bản sao trong một ổ đĩa / hệ thống. Thay vào đó, tôi sẽ quan tâm đến việc gửi một tệp và tìm kiếm các bản sao của nó.

Có ai biết nếu một chương trình như vậy tồn tại? Có lẽ một số chức năng tối nghĩa của Spotlight?


1
Hãy cảnh giác với hàm băm xác định xem một tệp đã cho có phải là bản sao hay không. Cách tiếp cận này có thể thất bại với các tệp .emlx (định dạng tệp của Apple Mail), chẳng hạn. Để hỗ trợ cho Spotlight, OSX sẽ thêm siêu dữ liệu vào các tệp thư. Cùng một email trong hai đường dẫn khác nhau có thể có siêu dữ liệu khác nhau mặc dù Id tin nhắn giống nhau. Băm khác nhau cho hai tệp chứa cùng một email thô.
John D.

Câu trả lời:


16

Bạn cũng có thể sử dụng fdupes. Nó không có tùy chọn để tìm kiếm các bản sao của một tệp cụ thể, nhưng bạn chỉ có thể grep đầu ra cho tên tệp:

fdupes -r1 .|grep filename

-rđệ quy vào các thư mục và -1in từng nhóm tệp trùng lặp trên một dòng.

Các ví dụ hữu ích khác:

fdupes -r . tìm thấy tất cả các tập tin trùng lặp trong thư mục hiện tại;

fdupes -r . -dN xóa tất cả ngoại trừ bản sao đầu tiên từ mỗi nhóm bản sao;

fdupes -r dir1 dir2|grep dir1/|xargs rmloại bỏ trùng lặp trong dir1.

Bạn có thể cài đặt fdupesvới brew install fdupes.


Có thể có một danh sách các tệp KHÔNG trùng lặp trong thư mục hiện tại không?
gagarine

7

Bạn có thể dễ dàng tự xây dựng điều này bằng một số lệnh shell:

  • find ~ -type f -exec md5 -r '{}' \; > /tmp/md5.list

    sẽ xây dựng một danh sách băm md5 trên tất cả các tệp của bạn.

  • grep $(md5 -q FILE-TO-SEARCH) /tmp/md5.list

    sẽ tìm kiếm băm md5 của FILE-TO-SEARCH

Chạy lệnh đầu tiên (đặc biệt nếu bạn chạy trên toàn bộ đĩa) sẽ mất nhiều thời gian.


Nếu bạn chỉ muốn tìm kiếm một tệp, bạn cũng có thể sử dụng

SIZE=$(stat -f '%z' FILE-TO-SEARCH)
MD5=$(md5 -q FILE-TO-SEARCH)
find ~ -type f -size ${SIZE}c | while read f; do
    [[ $MD5 = $(md5 -q "$f") ]] && echo $f
done

Vượt qua đầu tiên nên được tìm thấy bởi hoạt động kích thước chính xác.
dùng188421

@biziclop Nếu bạn chỉ muốn tìm kiếm một tập tin, vâng. Nếu bạn muốn tìm kiếm một số thì nhanh hơn để xây dựng chỉ mục một lần và chỉ cần tìm kiếm qua tệp chỉ mục sau đó.
nohillside

1
Tất nhiên, điều đó đúng, tôi chỉ chú ý câu này trong câu hỏi: "Thay vào đó, tôi sẽ quan tâm đến việc gửi một tệp và tìm kiếm các bản sao của nó."
dùng188421

fdupes nên nhanh hơn trước khi thực hiện so sánh ngày, sau đó băm một phần, sau đó băm đầy đủ.
gagarine

1

Điều này sẽ hoạt động nếu bạn thay thế kích thước và băm cho FILE_001 vào lệnh.

198452 byte là kích thước tệp tôi đã sử dụng và tệp md5 băm là 3915dc84b4f464d0d550113287c8273b

find . -type f -size 198452c -exec md5 -r {} \; |
    grep -o "3915dc84b4f464d0d550113287c8273b\ \(.*\)" | awk '{print $2}'

Đầu ra sẽ là một danh sách các tệp có tên đường dẫn liên quan đến thư mục được gửi đến lệnh find.

Cách tiếp cận này có ưu điểm là nó sẽ chỉ băm các tệp phù hợp với kích thước của bản gốc của bạn và sẽ chỉ xuất ra các tên tệp khớp với hàm băm.


0

Nếu bạn không muốn gây rối với các tập lệnh, bạn có thể tiến gần đến hành vi bạn muốn với Araxis Tìm các tệp trùng lặp $ 10 trong Mac App Store . Ngoài ra còn có một bản demo 7 ngày trên trang web của họ. Tìm các tệp trùng lặp tìm kiếm các bản sao bằng cách tính băm cho mỗi tệp.

Bạn có thể ước chừng hành vi bạn muốn thiết lập một thư mục với tệp duy nhất bạn quan tâm, sau đó thêm các thư mục bạn muốn tìm kiếm. Điều này cũng sẽ báo cáo các bản sao khác, nếu có, trong các đường dẫn tìm kiếm.

Ứng dụng này có nhiều tính năng sắp xếp đẹp làm cho kết quả rất dễ hiểu.

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.