Tìm kiếm và xóa các tệp trùng lặp với các tên khác nhau


7

Tôi có một bộ sưu tập nhạc lớn được lưu trữ trên ổ cứng của mình; và duyệt qua nó, tôi thấy rằng tôi có rất nhiều tệp trùng lặp trong một số thư mục album. Thông thường các bản sao tồn tại cùng với bản gốc trong cùng thư mục.

Thông thường định dạng là filename.mp3 và tệp trùng lặp là tên tệp 1.mp3 . Đôi khi có thể có nhiều hơn một tệp trùng lặp và tôi không biết liệu có các tệp trùng lặp trên các thư mục không (ví dụ: trùng lặp các thư mục album).

Có cách nào tôi có thể quét các tệp trùng lặp này không (ví dụ bằng cách so sánh kích thước tệp hoặc so sánh toàn bộ tệp để kiểm tra xem chúng có giống nhau không), xem lại kết quả và sau đó xóa các bản sao? Những cái có tên dài hơn hoặc những cái có ngày sửa đổi / tạo gần đây thường sẽ là mục tiêu xóa.

Có một chương trình ngoài đó có thể làm điều này trên Linux không?



@VincentNivoliers Cảm ơn, tôi đoán rằng câu hỏi của tôi cuối cùng là trùng lặp, mặc dù tôi không yêu cầu một chương trình dành riêng cho các tệp nhạc (tôi chỉ sử dụng âm nhạc làm ví dụ) câu hỏi đó có câu trả lời tôi cần để giải quyết cụ thể vấn đề.
Cestary

1
Tôi sẽ nói rằng nếu các tệp của bạn giống hệt với các bit, với các tên khác nhau, thì câu hỏi sẽ được giữ và tôi sẽ đề xuất sử dụng chương trình băm kết hợp với bảng băm để đề xuất các bản sao. Đối với các bộ sưu tập nhạc, điều này có lẽ không phải là trường hợp nếu các tệp tương đương đến từ các nguồn khác nhau.
Vincent Nivoliers

Vâng, đây là ý của tôi, các tệp nhạc chỉ là ví dụ của tôi, nhưng vì kịch bản chính xác của tôi liên quan đến các tệp nhạc, nên các chủ đề khác có thể đã có một giải pháp tốt cho tôi. Chương trình băm nghe có vẻ như là một giải pháp tốt không phụ thuộc vào filetypes, biết không?
Cestarian

Câu trả lời:


12

Có một chương trình như vậy, và nó được gọi là rdfind:

SYNOPSIS
   rdfind [ options ] directory1 | file1 [ directory2 | file2 ] ...

DESCRIPTION
   rdfind  finds duplicate files across and/or within several directories.
   It calculates checksum only if necessary.  rdfind  runs  in  O(Nlog(N))
   time with N being the number of files.

   If  two  (or  more) equal files are found, the program decides which of
   them is the original and the rest are considered  duplicates.  This  is
   done  by  ranking  the  files  to each other and deciding which has the
   highest rank. See section RANKING for details.

Nó có thể xóa các bản sao hoặc thay thế chúng bằng các liên kết tượng trưng hoặc cứng.


Tôi đang thử chương trình này ngay bây giờ.
Cestarian

Điều này hoạt động khá tốt, rdfind / mnt / stash / music cho tôi biết tổng cộng 1 GB có thể bị xóa và tạo một tệp results.txt để liệt kê tất cả các bản sao. rdfind -delave trùng lặp true / mnt / stash / music sau đó xóa 2104 tệp trùng lặp cho tôi. Cảm ơn! Chương trình này có hiệu suất rất cao, chỉ mất một phút để quét qua thư mục nhạc 200 + GB của tôi và chỉ vài giây để xóa các tệp trùng lặp trong lần chạy thứ hai. Nó sẽ được tốt đẹp nếu nó cũng sẽ xóa các thư mục trống mặc dù.
Cestarian

10

Hừm. Tôi chỉ phát triển một lớp lót để liệt kê tất cả các bản sao, cho một câu hỏi hóa ra là bản sao này. Làm thế nào meta. Chà, xấu hổ khi lãng phí nó, vì vậy tôi sẽ đăng nó, mặc dù rdfindnghe có vẻ là một giải pháp tốt hơn.

Điều này ít nhất có lợi thế là cách Unix "thực sự" để làm điều đó;)

find -name '*.mp3' -print0 | xargs -0 md5sum | sort | uniq -Dw 32

Phá vỡ đường ống xuống:

find -name '*.mp3' -print0 tìm thấy tất cả các tệp mp3 trong cây con bắt đầu từ thư mục hiện tại, in các tên được phân tách bằng NUL.

xargs -0 md5sum đọc danh sách được phân tách bằng NUL và tính toán tổng kiểm tra trên mỗi tệp.

Bạn biết những gì sortkhông.

uniq -Dw 32 so sánh 32 ký tự đầu tiên của các dòng được sắp xếp và chỉ in những ký tự có cùng hàm băm.

Vì vậy, bạn kết thúc với một danh sách tất cả các bản sao. Sau đó, bạn có thể thu nhỏ thủ công xuống những cái bạn muốn xóa, xóa băm và đưa danh sách vào rm.


Đối với hồ sơ, đây là những gì ban đầu tôi hy vọng sẽ thấy là một câu trả lời: PA one liner mà không cần tải xuống bất kỳ phần mềm bổ sung nào (không phải là tôi có bất cứ điều gì chống lại điều đó, tôi chỉ thích "sạch") công việc, sắp xếp thủ công và loại bỏ các tệp có tổng kiểm phù hợp là một chút công việc, lý tưởng là nó nên được thực hiện tự động bằng cách xóa tất cả các tệp có cùng một tổng kiểm tra cho một tệp có tên tệp ngắn nhất.
Cestarian

Đẹp một lót. Một trong những điều rdfindtốt hơn là kiểm tra kích thước tệp trước tiên để loại trừ các tệp duy nhất khỏi danh sách
golimar

2

Tôi rất vui vì bạn đã hoàn thành công việc rdfind.

Lần sau bạn cũng có thể xem xét rmlint. Nó cực kỳ nhanh và cung cấp một vài tùy chọn khác nhau để giúp xác định tệp nào là bản gốc trong mỗi bộ trùng lặp.


Vâng, tôi không thích cách tiếp cận của rdfind trong việc tìm bản gốc, đã xảy ra rằng các tệp mà tôi đã coi là bản sao không bị xóa (tức là bản gốc đã bị xóa) mặc dù tôi không phải là OCD. ..
Cestarian

2

Tôi đang nghĩ đến việc sử dụng Perl:

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;
use Digest::SHA qw ( sha1_hex );

my %seen;

sub find_dupes {
    next if -d;
    local $/;
    open( my $input, "<", $File::Find::name ) or warn $!;
    my $sha1sum = sha1_hex(<$input>);
    close($input);
    if ( $seen{$sha1sum} ) {
        print "$File::Find::name is probably a dupe of $seen{$sha1sum} - both have $sha1sum\n";
    }
    $seen{$sha1sum} = $File::Find::name;
}

find( \&find_dupes, "/path/to/search", "/another/path/to/search" );
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.