내 하드 드라이브에 대규모 음악 컬렉션이 저장되어 있는데, 이를 탐색하면서 일부 앨범 디렉토리에서 중복된 파일을 많이 발견했습니다. 일반적으로 복사본은 원본과 동일한 디렉터리에 존재합니다.
일반적인 형식은파일명.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 md5sum
NUL로 구분된 목록을 읽고 각 파일의 체크섬을 계산합니다.
당신은 sort
그것이 무엇을하는지 알고 있습니다.
uniq -Dw 32
정렬된 줄의 처음 32자를 비교하여 동일한 해시 값을 가진 문자만 인쇄합니다.
따라서 모든 중복 목록이 생성됩니다. 그런 다음 제거하려는 항목으로 수동으로 줄이고 해시를 제거한 다음 목록을 rm
.
답변3
답변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" );