공백과 개행 문자를 무시하고 동일한 파일을 함께 클러스터링합니다.

공백과 개행 문자를 무시하고 동일한 파일을 함께 클러스터링합니다.

많은 XML 파일(10K 작은 텍스트 파일)이 포함된 폴더를 생각해 보세요. 일부 XML 파일은 동일하고 일부는 다릅니다.

어떤 파일이 동일한지 확인하고 싶습니다(공백, 탭, 줄바꿈 무시) 어떻게든 각 클러스터의 파일을 기록합니다.

높은 정밀도는 필요하지 않으므로 MD5 또는 다른 해싱 알고리즘을 사용하는 것이 한 가지 방법이라고 생각합니다. 즉, 정확히 동일한 MD5 합계를 사용하여 파일 수를 세지만 미리 공백을 제거해야 합니다.

저는 OS X를 사용하고 있으며 다음과 같이 파일의 MD5를 확인할 수 있습니다.

$ md5 file_XYZ.xml
MD5 (file_XYZ.xml) = 0de0c7bea1a75434934c3821dcba759a

이것을 어떻게 사용하여 동일한 파일을 클러스터링할 수 있습니까? (동일한 해시를 가진 파일 이름을 가진 텍스트 파일이나 폴더에 클러스터된 파일이 트릭을 수행합니다)

답변1

다음을 사용하여 각 XML 파일의 "정규화된" 버전을 만들 수 있습니다.

xmllint --nospace --format orginal.xml > normalized.xml

이렇게 하면 XML에 "중요하지 않은" 공백, 일관된 들여쓰기 등이 제거됩니다. 나중에 cksum동일한 것을 찾는 데 사용할 수 있습니다정규화됨문서.

나는 스크립트를 제안하고 싶습니다 :

for ORIGXML in *.xml
do
    xmllint --noblank --format "$ORIGXML" > "normalized.$ORIGXML"
    cksum "normalized.$ORIGXML" | sed 's/^normalized\.//' >> files.list
done
sort -k1.1 files.list > sorted.files

MD5 체크섬이 필요한지 잘 모르겠습니다. 당신은 당신을 반대하는 사악한 상대와의 암호화가 아닌 중복을 찾고 있습니다.

"거의 동일한" XML 파일을 찾고 있다면 다음을 사용할 수 있습니다.표준화된 압축 거리파일이 서로 얼마나 "멀리" 떨어져 있는지 확인하십시오. 더 간단하게는 XML 파일을 gzip정렬 bzip2한 다음 압축 파일의 크기를 기준으로 정렬할 수 있습니다. 압축된 파일 크기가 가까울수록 XML 파일은 더 유사해집니다.

관련 정보