중복 파일 찾기


90

디스크에서 동일하지만 파일 이름이 다른 중복 파일을 디스크에서 찾을 수 있습니까?


3
가능한 모든 방법은 시스템의 모든 단일 파일 을 다른 모든 단일 파일 과 비교해야 합니다 . 따라서 바로 가기 를 수행하는 경우에도 시간 이 오래 걸립니다.
Shadur

4
@Shadur 체크섬에 문제가 없다면 대부분의 시스템에서 일반적으로 10 ^ (5 + -1) <64 바이트 항목의 해시를 비교하는 것으로 요약됩니다. 물론 데이터를 한 번 이상 읽어야합니다. :)
peterph

15
@Shadur 사실이 아닙니다. 일치하는 st_sizes 를 확인 하고 같은 것을 하나만 제거한 다음 st_sizes에 대한 md5sum 만 계산 하여 시간을 줄일 수 있습니다 .
Chris Down

6
@Shadur는 해시 작업을 허용하지 않는 엄청나게 어리석은 접근 방식조차도 Θ (n²)가 아닌 Θ (n log n) 비교에서 여러 가지 정렬 알고리즘 (파일 내용 기반)을 사용하여이를 수행 할 수 있습니다.
derobert

1
@ChrisDown 예, 크기 일치는 내가 생각한 바로 가기 중 하나입니다.
Shadur

답변:


104

fdupes이것을 할 수 있습니다. 보낸 사람 man fdupes:

지정된 파일에서 중복 파일을 검색합니다. 이러한 파일은 파일 크기와 MD5 서명을 비교 한 후 바이트 단위로 비교하여 찾을 수 있습니다.

데비안 또는 우분투에서는으로 설치할 수 있습니다 apt-get install fdupes. Fedora / Red Hat / CentOS에서는로 설치할 수 있습니다 yum install fdupes. 아치 리눅스에서는 pacman -S fdupes, 젠투에서는 사용할 수 있습니다 emerge fdupes.

파일 시스템 루트에서 내려 오는 검사를 실행하려면 상당한 시간과 메모리가 소요될 수 있습니다 fdupes -r /.

의견에 따라 다음을 수행하여 가장 큰 사본을 얻을 수 있습니다.

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

파일 이름에 줄 바꿈이 포함되어 있으면 중단됩니다.


감사. 가장 큰 듀피를 어떻게 걸러 낼 수 있습니까? 크기를 사람이 읽을 수있게하려면 어떻게해야합니까?
학생

@student : 라인을 따라 무언가를 사용하십시오 (fdupes는 추가 정보없이 파일 이름을 출력하거나 잘라 내거나 sed하도록하십시오) : fdupes ....... | xargs ls -alhd | egrep 'M |G '파일을 사람이 읽을 수있는 형식으로 유지하고 크기가 메가 바이트 또는 기가 바이트 인 파일 만 유지하십시오. 실제 출력에 맞게 명령을 변경하십시오.
Olivier Dulac

2
@OlivierDulac 절대로 ls를 파싱 해서는 안됩니다 . 일반적으로 유스 케이스보다 나쁘지만 유스 케이스에서도 오 탐지의 위험이 있습니다.
Chris Down

@student-파일 이름을 찾으면 du파이프로 sort알려줍니다.
Chris Down

@ChrisDown : 그것은 나쁜 습관이고, 잘못된 긍정을 줄 수 있습니다. 그러나이 경우 (대화 형 사용 및 표시 전용으로 "rm"또는 직접 의존하는 것은 없습니다) ^^. 나는 당신이 btw에 링크하는 그 페이지를 좋아합니다 (몇 달 후 읽었으며 많은 유용한 정보가 가득합니다)
Olivier Dulac

26

또 다른 좋은 도구는 fslint다음과 같습니다.

fslint는 중복 파일 및 문제가있는 파일 이름 등을 포함하여 파일 시스템에 대한 다양한 문제를 찾는 도구 세트입니다.

GUI 외에 개별 명령 행 도구를 사용하여 액세스 할 수 있으며 표준 설치에서 / usr / share / fslint / fslint 디렉토리를 변경하거나 $ PATH에 추가 할 수 있습니다. 해당 디렉토리의 각 명령에는 매개 변수를 자세히 설명하는 --help 옵션이 있습니다.

   findup - find DUPlicate files

데비안 기반 시스템에서는 다음과 같이 설치할 수 있습니다.

sudo apt-get install fslint

타사 도구를 원하지 않거나 설치할 수없는 경우에도 수동으로 수행 할 수 있습니다. 이러한 프로그램의 대부분의 작동 방식은 파일 체크섬 을 계산하는 것 입니다. 동일한 md5sum을 가진 파일은 거의 정확히 동일한 데이터를 포함합니다. 따라서 다음과 같이 할 수 있습니다.

find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 

샘플 출력 (이 예제의 파일 이름은 동일하지만 다른 경우에도 작동합니다) :

$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
 /usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---

이것은 이미 언급 된 전용 도구보다 훨씬 느리지 만 작동합니다.


4
를 사용하여 다른 파일과 동일한 크기의 파일을 찾는 것이 훨씬 빠를 것 st_size입니다.이 크기의 파일이 하나만있는 파일은 제거하고 동일한 파일 사이의 md5sum 만 계산하십시오 st_size.
Chris Down

@ChrisDown 예, 간단하게 유지하고 싶었습니다. 당신이 제안하는 것은 물론 속도를 크게 높일 것입니다. 그래서 나는 대답이 끝날 때 느려질 것에 대한 면책 ​​조항을 가지고 있습니다.
terdon

8

짧은 대답 : 예.

더 긴 버전 : wikipedia fdupes 항목을 살펴보면 , 미리 만들어진 솔루션의 훌륭한 목록을 보여줍니다. 물론 당신은 그렇지 않아, 자신을 작성할 수 있습니다 와 같은 해시 프로그램 - 어려운 diff, sha*sum, find, sortuniq작업을 수행해야합니다. 한 줄에 넣을 수도 있으며 여전히 이해할 수 있습니다.


6

도메인에서 해시 함수 (여기서는 MD5)에 충돌이 없다고 생각되는 경우 :

find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
 | cut --characters=35-

동일한 파일 이름을 그룹화 하시겠습니까? not_uniq.sh출력을 형식화 하는 간단한 스크립트 를 작성하십시오 .

#!/bin/bash

last_checksum=0
while read line; do
    checksum=${line:0:32}
    filename=${line:34}
    if [ $checksum == $last_checksum ]; then
        if [ ${last_filename:-0} != '0' ]; then
            echo $last_filename
            unset last_filename
        fi
        echo $filename
    else
        if [ ${last_filename:-0} == '0' ]; then
            echo "======="
        fi
        last_filename=$filename
    fi

    last_checksum=$checksum
done

그런 다음 find스크립트를 사용하도록 명령을 변경 하십시오.

chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh

이것이 기본 아이디어입니다. find파일 이름에 일부 문자가 포함되어 있으면 변경 해야합니다. (예 : 공간)


6

나는 fdupes, 최근 강화 된 포크 추가 할 생각 jdupes 될 것을 약속, 빠른 및 fdupes보다 더 풍부한 더 기능 (예 : 크기 필터) :

jdupes . -rS -X size-:50m > myjdups.txt

현재 디렉토리에서 50MB보다 큰 중복 파일을 재귀 적으로 찾고 결과 목록을 myjdups.txt에 출력합니다.

출력은 크기별로 정렬되지 않으며 빌드되지 않은 것처럼 보이기 때문에 위의 @Chris_Down 답변을 조정했습니다.

jdupes -r . -X size-:50m | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n > myjdups_sorted.txt

참고 : 최신 버전의 jdupes는 전체 해시를 기다리는 대신 부분 해시 만있는 파일 일치를 지원합니다. 매우 유용한. (git 아카이브를 복제하여 가져와야합니다.) 여기에 내가 사용하는 옵션이 있습니다 : jdupes -r -T -T --exclude = size- : 50m --nohidden
Benjamin

2

Wikipedia에는 이 작업에 사용할 수있는 오픈 소스 소프트웨어 목록 이 포함 된 기사 ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders )가 있지만 지금은 삭제되었습니다 .

fslint의 GUI 버전은 매우 흥미 롭기 때문에 마스크를 사용하여 삭제할 파일을 선택할 수 있습니다. 복제 된 사진을 청소하는 데 매우 유용합니다.

Linux에서는 다음을 사용할 수 있습니다.

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

FSLint를 확인하지 않은 많은 시스템 (Windows, Mac 및 Linux)에서 마지막 2 작업


5
링크가 아니라 여기에 실제 정보를 제공하는 것이 좋습니다. 링크가 변경 될 수 있습니다. 그러면 답변에 아무런 가치가 없습니다
Anthon

2
Wikipedia 페이지가 비어 있습니다.
ihor_dvoretskyi

그렇습니다, 그것은 청소되었습니다, 동정심이 얼마나 동요 ...
MordicusEtCubitus

이 3 가지 도구를 사용하여 편집했습니다
MordicusEtCubitus

0

여기에 내가 취하는 것이 있습니다.

find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
  echo -n '.'
  if grep -q "$i" md5-partial.txt; then echo -e "\n$i  ---- Already counted, skipping."; continue; fi
  MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
  MD5=`echo $MD5 | cut -d' ' -f1`
  if grep "$MD5" md5-partial.txt; then echo "\n$i  ----   Possible duplicate"; fi
  echo $MD5 $i >> md5-partial.txt
done

파일의 처음 1MB까지만 해시한다는 점이 다릅니다.
이것은 몇 가지 문제 / 기능이 있습니다 :

  • 처음 1MB 이후에는 차이가있을 수 있으므로 결과를 확인해야합니다. 나중에 고칠 수 있습니다.
  • 파일 크기로 먼저 확인하면 속도가 빨라질 수 있습니다.
  • 3MB보다 큰 파일 만 가져옵니다.

비디오 클립을 비교하는 데 사용하므로 이것으로 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.