중복 파일 찾기

중복 파일 찾기

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

답변1

fdupes이것은 가능합니다. 에서 man fdupes:

특정 경로에서 중복 파일을 검색합니다. 이러한 파일은 파일 크기를 MD5 서명과 비교한 다음 바이트별로 비교하여 찾습니다.

Debian 또는 Ubuntu에서는 apt-get install fdupes.Fedora/Red Hat/CentOS에서는 yum install fdupes.Arch Linux pacman -S fdupes에서는 emerge fdupes.

파일 시스템 루트에서 시작하여 검사를 실행하려면(많은 시간과 메모리가 소요될 수 있음) 다음과 같은 것을 사용하십시오 fdupes -r /.

의견에서 요청한 대로 다음을 수행하여 최대 중복 수를 얻을 수 있습니다.

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

파일 이름에 개행 문자가 포함되어 있으면 중단됩니다.

답변2

또 다른 좋은 도구는fslint:

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

GUI 외에도 표준 설치에서 /usr/share/fslint/fslint 디렉터리로 변경하거나 $PATH에 추가하여 액세스할 수 있는 별도의 명령줄 도구가 제공됩니다. 이 디렉터리의 각 명령에는 해당 인수를 더 자세히 설명하는 --help 옵션이 있습니다.

   findup - find DUPlicate files

Debian 기반 시스템에서는 다음 명령을 사용하여 설치할 수 있습니다.

sudo apt-get install fslint

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

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

출력 예(이 예에서는 동일한 파일 이름이지만 다른 이름도 작동함):

$ while read -r 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
---

이것은 ~이 될 것이다많은이미 언급한 전용 도구보다 느리지만 작동할 것입니다.

답변3

최근에 강화된 fdupes 브랜치를 추가하고 싶습니다.뒤퓌, 이는서둘러요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

답변4

해시 함수(여기서는 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파일 이름에 특정 문자가 포함되어 있으면 이름을 변경해야 합니다. (예: 우주)

관련 정보