중복된 파일이 있는 폴더 md5sum
( md5
Mac의 경우) 가 있고예약 된 일들검색된 모든 작업은 삭제되도록 예약되어 있습니다.
그러나 나는 이것을 수행하는 방법을 결코 알지 못했습니다. 내가 지금까지 가지고 있는 것:
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가 뱉어낸 파일 이름은 rm
with 에 입력되는데 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 조정 참조).-P
man 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