Bash를 사용하여 중복 파일을 제거하는 방법

Bash를 사용하여 중복 파일을 제거하는 방법

중복된 파일이 있는 폴더 md5sum( md5Mac의 경우) 가 있고검색된 모든 작업은 삭제되도록 예약되어 있습니다.

그러나 나는 이것을 수행하는 방법을 결코 알지 못했습니다. 내가 지금까지 가지고 있는 것:

md5 -r * | sort

출력은 다음과 같습니다.

04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg

중복을 제거하기 위해 파일의 MD5를 기반으로 처리하는 방법은 무엇입니까? 난 정말 상관 없어어느"원본"은 보관하고 있지만 하나만 보관하고 싶습니다.

이 문제를 다르게 처리해야 합니까?

답변1

저는 Linux에서 작업 중입니다. 이는 이 명령이 다음과 md5sum같이 출력됨을 의미합니다.

> md5sum *
d41d8cd98f00b204e9800998ecf8427e  file_1
d41d8cd98f00b204e9800998ecf8427e  file_10
d41d8cd98f00b204e9800998ecf8427e  file_2
d41d8cd98f00b204e9800998ecf8427e  file_3
d41d8cd98f00b204e9800998ecf8427e  file_4
d41d8cd98f00b204e9800998ecf8427e  file_5
d41d8cd98f00b204e9800998ecf8427e  file_6
d41d8cd98f00b204e9800998ecf8427e  file_7
d41d8cd98f00b204e9800998ecf8427e  file_8
d41d8cd98f00b204e9800998ecf8427e  file_9
b026324c6904b2a9cb4b88d6d61c81d1  other_file_1
31d30eea8d0968d6458e0ad0027c9f80  other_file_10
26ab0db90d72e28ad0ba1e22ee510510  other_file_2
6d7fce9fee471194aa8b5b6e47267f03  other_file_3
48a24b70a0b376535542b996af517398  other_file_4
1dcca23355272056f04fe8bf20edfce0  other_file_5
9ae0ea9e3c9c6e1b9b6252c8395efdc1  other_file_6
84bc3da1b3e33a18e8d5e1bdd7a18d7a  other_file_7
c30f7472766d25af1dc80b3ffc9a58c7  other_file_8
7c5aba41f53293b712fd86d08ed5b36e  other_file_9

현재 awk명령 xargs은 다음과 같습니다:

md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm

awk부분은 어떤 해시와도 일치하지 않는 빈 문자열로 초기화된 다음, 각 행의 해시가 현재 파일(두 번째 열)의 해시(첫 번째 열)와 동일한 lasthash지 확인합니다 . lasthash그렇다면 인쇄해 보세요. 각 단계가 끝나면 lasthash현재 파일의 해시로 설정됩니다(해시가 다른 경우에만 설정하도록 제한할 수 있지만 이는 사소한 일입니다. 특히 파일이 많지 않은 경우에는 더욱 그렇습니다). 일치하는 파일). awk가 뱉어낸 파일 이름은 rmwith 에 입력되는데 xargs, 이는 기본적으로 rm해당 섹션을 호출하여 우리에게 콘텐츠를 제공합니다 awk.

먼저 디렉터리를 필터링해야 할 수도 있습니다 md5sum *.

편집하다:

Marcins 방법을 사용하면 다음 방법도 사용할 수 있습니다.

comm -1 -2 \
  <(ls) | \
  <(md5sum * | \
    sort -k1 | \
    uniq -w 32 | \
    awk '{print $2}' | \
    sort) \
xargs rm

ls이는 획득된 각 고유 해시의 첫 번째 파일 이름으로 획득된 파일 목록에서 뺍니다 md5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'.

답변2

다음 명령을 사용하여 중복 파일을 식별할 수 있습니다.

md5sum * | sort -k1 | uniq -w 32 -d

답변3

나는 달렸다레플리카이와 유사한 질문에 대한 답변은 다음과 같습니다.https://superuser.com/questions/386199/how-to-remove-duplicate-files-in-a-directory

우분투에서는 할 수 있습니다 apt-get install fdupes. 맨 페이지를 꼭 읽어보고 싶을 것입니다. 내 경우에는 다음과 같이 원하는 결과를 얻을 수 있었다.

fdupes -qdN -r /ops/backup/

"/ops/backup을 반복적으로 살펴보고 모든 중복 파일을 찾습니다. 지정된 파일의 첫 번째 복사본을 유지하고 나머지는 자동으로 삭제합니다." 이렇게 하면 데이터베이스에 자주 기록되지 않는 여러 덤프를 쉽게 유지하기가 매우 어렵습니다. .

답변4

서두르고(또는 파일이 많음) 정렬 오버헤드(시간이 소요됨)를 피하고 싶지만 해시 테이블의 메모리 오버헤드는 신경 쓰지 않는 경우(또는 메모리가 충분하고 파일이 많음) ,

find . -type f -print0 | xargs -0 md5sum | awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }' | xargs -0 rm

find . -type f -print0: 모든 파일을 찾아 null로 끝나는 이름을 출력합니다.

xargs -0 md5sum: 해시를 병렬로 계산합니다( -n필요에 따라 max-args 및 max-procs 조정 참조).-Pman xargs

awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }': 현재 보고 있는 md5sum을 포함하는 awk 해시 테이블에 항목이 있으면 현재 보고 있는 파일 이름을 null로 종료하여 인쇄합니다. 그렇지 않으면 해시 테이블에 파일 이름을 추가하십시오.

xargs -0 rm: 파이프를 통해 null로 끝나는 문자열 입력을 가져와서 rm으로 보냅니다.

이것은 fdupes보다 훨씬 빠릅니다.

파일 이름에 줄 바꿈 문자가 포함되어 있으면 md5sum도 줄 바꿈 문자로 레코드를 구분하기 때문에 awk는 줄 바꿈 문자에서 이를 잘라낼 수 있습니다.

이는 다음을 기반으로 합니다.https://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sorting그리고https://stackoverflow.com/questions/9133315/how-can-i-output-null-termerated-strings-in-awk

관련 정보