중복이 많습니다...fdupes 없이 스크립트를 만들고 싶습니다

중복이 많습니다...fdupes 없이 스크립트를 만들고 싶습니다

fdup하지 마세요.. 스크립트를 만들고 싶습니다.

200개 이상의 중복된 파일이 많이 있습니다.

나는 bash 스크립트를 만들었습니다.

각 파일에 대해 md5sum을 사용한 다음 uniq를 사용하여 중복 md5를

다른 파일을 찾은 다음 중복 항목을 다시 확인하고 전체 줄을 넣었습니다.

세 번째 최종 문서에서.

이제 문제는... 이러한 중복 항목을 하나씩 제거할 수 있느냐는 것입니다.

하지만 내 질문은: 중복 항목을 찾아 안전하게 삭제하기 위해 네 번째 파일에 넣는 것이 가능합니까?

이게 스크립트야

#!/bin/bash

# Script is "under construction"

# First we make the md5sum
find mp3 -type f -print0 |xargs -0 md5sum|tee firstfile.txt

# Then we find all the md5sum identical and put in secondfile.txt
sort +1rn -2 +0 -1 firstfile.txt |awk '{print $1}'|uniq -d > secondfile.txt


# then we extract from the secondfile and firstfile md5sum and name
while read line;do grep -i $line firstfile.txt;done  < secondfile.txt > thirdfinal.txt

이제 문제..thirdfinal.txt에는 다음과 유사한 줄이 많이 포함되어 있습니다.

625e8fd5f878b19b39826db539e01cda  mp3/16.mp3
625e8fd5f878b19b39826db539e01cda  mp3/12.mp3
625e8fd5f878b19b39826db539e01cda  mp3/20.mp3
625e8fd5f878b19b39826db539e01cda  mp3/21.mp3
625e8fd5f878b19b39826db539e01cda  mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/9.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3

내 질문은... 세 번째 파일을 가져오기 위해 어떻게 grep합니까?

첫 번째 파일을 제외한 모든 중복 항목을 포함하는 네 번째 파일

줄(그렇지 않으면 원본 파일을 포함한 모든 파일이 삭제됩니다!)

따라서 반복되는 행을 가질 수 있지만 동시에

원본을 보관하세요.

네 번째 파일은 다음과 같이 나타나야 합니다.

625e8fd5f878b19b39826db539e01cda  mp3/12.mp3
625e8fd5f878b19b39826db539e01cda  mp3/20.mp3
625e8fd5f878b19b39826db539e01cda  mp3/21.mp3
625e8fd5f878b19b39826db539e01cda  mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3

제안? 대답하지 마세요. fdup이나 외부 프로그램을 사용하세요..I

Bash 자동화를 선호하세요

답변1

awk '{ if (seen[$1]++) print }' < file3 > file4

특정 md5sum에 대한 배열 값이 이미 표시된 경우 열 1에 md5sum의 awk 배열이 작성됩니다.아니요처음 본 경우) 해당 줄을 인쇄하세요. 어느 쪽이든 기본값 0부터 시작하여 md5sum 배열 값을 증가시킵니다.


또 다른 방법은 bash 연관 배열을 사용하는 것입니다.

unset md5sums
declare -A md5sums
while read md5sum path
do 
  ((md5sums[$md5sum]++))
  [[ ${md5sums[$md5sum]} -gt 1 ]] && printf "%s %s\n" "$md5sum" "$path" 
done < file3 > file4

관련 정보