
약 300개의 텍스트 파일이 있는 폴더가 있습니다. 각 파일을 개별적으로 읽고 중복 항목을 제거하는 명령이 있습니까? 파일 이름이 아니라 내용을 의미합니다.
답변1
있는 경우 fdupes
폴더의 모든 중복 파일을 나열할 수 있습니다.
당신은 참조 할 수 있습니다이것이 명령을 사용하는 방법에 대한 온라인 자습서입니다 fdupes
.
시험
라는 이름의 3개 파일을 만들었습니다.파일 1,파일 2그리고파일 3그리고파일 1그리고파일 2정확히 같은 내용으로요.
이제 명령을 실행합니다.
fdupes -rdN .
그 중(위 링크에서 인용),
- 이
r
옵션을 사용하면 fdupes가 파일을 반복적으로 검색하게 됩니다. - 이
d
옵션을 사용하면 fdupes가 중복 항목을 제거합니다. - 이
N
옵션을 와 함께 사용하면d
각 중복 세트의 첫 번째 파일을 유지하고 사용자에게 메시지를 표시하지 않고 다른 파일을 삭제합니다.
위의 명령을 실행한 후파일 1그리고파일 3내 폴더에파일 2삭제되었습니다.
답변2
피에르 올리비에 바레세(Pierre Olivier Varese)의 답변
공백 등이 포함된 파일 이름을 갖고 사용해야 -print0
합니다 .xargs -0
좋다:
find . -type f -name "*.txt" -print0 |
xargs -0 md5sum |
awk '{print $2,$1}' |
sort -k 2 |
uniq --all-repeated=prepend -f 1 |
awk '/^$/ { I=1 }; /^./ { if (I==0) {print $1} I = 0; }' |
xargs echo
이것을 실행하십시오. 합리적인 결과가 나오면 xargs rm --
다시 실행하는 대신 사용하세요 xargs echo
.
답변3
fdupes를 사용할 수 없는 경우 다음을 사용할 수도 있습니다.
for first in *.txt
do
for second in *.txt
do
if diff $first $second >/dev/null 2>&1 && [ "$first" != "$second" ]
then
#echo $first and $second match. Deleting ${second}. # Optional, uncomment to use.
rm $second
fi
done
done
참고: 이는 매우 비효율적입니다. 300개의 파일에 대해 diff를 90,000번 수행합니다. 상당히 작은 파일이라면 여전히 빠르지만, 큰 파일이라면 시간이 오래 걸릴 수 있습니다.
답변4
두 번째 답변으로, fdupes를 사용할 수 없는 경우 더 효율적인 접근 방식은 md5를 사용하여 해시를 얻고 sort 및 uniq를 사용하여 이중 쉘 루프를 사용하지 않고 중복 항목을 찾는 것입니다.
다음과 같습니다: (모두 한 줄에 설명 없음)
find . -type f -name '*.txt' // get recursively all .txt files
| xargs md5sum // compute the md5 sum
| awk '{print $2,$1}' // reverse the md5sum output
| sort -k 2 // sorts on the md5 hash
| uniq --all-repeated=prepend -f 1 // get groups of duplicate files
| awk '/^$/ { I=1 }; /^./ { if (I==0) {print $1} I = 0; }' // see below
| xargs rm // delete
발생한 모든 .txt 파일을 삭제합니다.
(엄밀히 말하면 MD5 충돌은 일반적인 상황에서는 발생하지 않기 때문에 무시합니다.)
uniq 및 awk 라인 설명:
Let's assume :
file1:This is a 1st content
file2:This is a 1st content
file3:This is a 2nd content
file4:This is a 3rd content
file5:This is a 1st content
file6:This is a 3rd content
정렬 결과는 다음과 같습니다.
file4 801620325e6bc5efa4333a9413811e23
file6 801620325e6bc5efa4333a9413811e23
file3 8f9722a09b4c6f0ddf867e268193ea1b
file1 a066d80d23803dffa9fbc1cdcd95e163
file2 a066d80d23803dffa9fbc1cdcd95e163
file5 a066d80d23803dffa9fbc1cdcd95e163
uniq --all-repeated=prepend -f 1
중복된 항목만 유지하고 각 블록 앞에 빈 줄을 추가합니다.
(blank line)
file4 801620325e6bc5efa4333a9413811e23
file6 801620325e6bc5efa4333a9413811e23
(blank line)
file1 a066d80d23803dffa9fbc1cdcd95e163
file2 a066d80d23803dffa9fbc1cdcd95e163
file5 a066d80d23803dffa9fbc1cdcd95e163
그런 다음 mini awk 스크립트는 빈 줄을 무시하고 빈 줄을 따르지 않는 줄의 첫 번째 필드만 인쇄합니다.
(--> not printed: blank line)
(--> not printed: file4)
file6
(--> not printed: blank line)
(--> not printed: file1)
file2
file5
그런 다음 xargs rm은 나머지 파일(예: 중복 파일)을 rm할 수 있습니다.