
내 디스크에서 동일하지만 파일 이름이 다른 중복 파일을 찾을 수 있습니까?
답변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
파일 이름에 특정 문자가 포함되어 있으면 이름을 변경해야 합니다. (예: 우주)