이름이 다른 중복 파일 검색 및 삭제

이름이 다른 중복 파일 검색 및 삭제

내 하드 드라이브에 대규모 음악 컬렉션이 저장되어 있는데, 이를 탐색하면서 일부 앨범 디렉토리에서 중복된 파일을 많이 발견했습니다. 일반적으로 복사본은 원본과 동일한 디렉터리에 존재합니다.

일반적인 형식은파일명.mp3중복 파일은파일명 1.mp3. 때로는 중복된 파일이 여러 개 있을 수 있으며, 폴더 전체에 중복된 파일이 있는지 알 수 없습니다(예: 사진 앨범 디렉터리의 중복).

이러한 중복 파일을 검색하고(예: 파일 크기를 비교하거나 전체 파일을 비교하여 동일한지 확인) 결과를 확인한 다음 중복을 제거할 수 있는 방법이 있습니까? 이름이 긴 파일이나 수정/생성 날짜가 최신인 파일은 삭제 대상이 되는 경우가 많습니다.

Linux에서 이 작업을 수행할 수 있는 프로그램이 있습니까?

답변1

이런 프로그램이 있는데 이름은 다음과 같습니다 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.

중복된 항목을 제거하거나 기호 또는 하드 링크로 바꿀 수 있습니다.

답변2

흡입. 나는 이것과 중복되는 문제를 해결하기 위해 모든 중복 항목을 나열하는 한 줄을 개발했습니다. 얼마나 메타. 글쎄, 낭비한 것이 부끄럽기 때문에 rdfind더 나은 해결책처럼 들리더라도 게시하겠습니다 .

이것은 적어도 "진짜" 유닉스 방식이라는 장점이 있습니다. ;)

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

파이프를 부수세요:

find -name '*.mp3' -print0현재 디렉터리부터 시작하여 하위 트리에 있는 모든 mp3 파일을 찾아 이름을 인쇄합니다(NUL로 구분).

xargs -0 md5sumNUL로 구분된 목록을 읽고 각 파일의 체크섬을 계산합니다.

당신은 sort그것이 무엇을하는지 알고 있습니다.

uniq -Dw 32정렬된 줄의 처음 32자를 비교하여 동일한 해시 값을 가진 문자만 인쇄합니다.

따라서 모든 중복 목록이 생성됩니다. 그런 다음 제거하려는 항목으로 수동으로 줄이고 해시를 제거한 다음 목록을 rm.

답변3

일을 끝내셨다니 기뻐요 rdfind.

다음에 고려해보시면 됩니다rmlint. 매우 빠르고 몇 가지 다른 기능을 제공합니다.옵션각 복사본 세트에서 어떤 파일이 원본인지 확인하는 데 도움이 됩니다.

답변4

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" );

관련 정보