2010-03-08 5 views
3

크기가 약 10MB 인 대량의 파일 (30,000 개)을 다루고 있습니다. 그들 중 일부는 (나는 2 %로 추정한다.) 실제로 복제되고, 나는 모든 복제 쌍 (또는 트리플렛)에 대해서만 사본을 보관해야한다. 효율적인 방법을 제안 해 주시겠습니까? 나는 유닉스에서 일하고있다.UNIX에서 동일한 파일 제거

감사합니다 :-)

+0

복제본은 다음을 기반으로 할 수 있습니다. 1. 내용 2. 파일 이름 어떻게 하시겠습니까? – coder

+0

내용 :-) 파일 이름 기반이 너무 쉽습니다. –

답변

2

모든 파일의 해시를 생성하는 스크립트를 작성합니다. 집합에 해시를 저장하고 파일을 반복하며 파일이 이미 세트에서 발견 된 값으로 해시되는 경우 파일을 삭제할 수 있습니다. 이것은 예를 들어 파이썬에서하는 일은 간단합니다.

해시 테이블 항목 당 64 바이트 인 30,000 개의 파일에 대해 약 200MB 만보고 있습니다.

+0

메타 바이트 란 무엇입니까? 어떤 종류의 이상화 된 바이트? 그리고 해시 함수가 완벽한 경우에만 솔루션이 작동합니다. –

+0

* *는 메타 바이트가 아닙니다. 결정된. 편집증은 삭제의 경우 파일 내용을 비교할 수 있습니다. 여분의 해시를 추가하는 것도 도움이 될 수 있습니다. – Joe

+0

@Neil 현대의 깨지지 않은 암호화 해시 함수를 사용하고 충돌을 발견하면 알고리즘은 고장 나지만 암호 용지를 얻었으므로 모두 승리합니다. 그것은 그들 중 하나를 지우기 전에 가정 중복을 비교 가치가있다. –

1

먼저 파일 크기를 비교 한 다음 MD5 체크섬 (물론 캐싱)을 수행하는 스크립트를 작성하고 데이터 손실에 대해 매우 염려하면 글 머리 기호를 물어보고 실제로 중복 된 바이트를 바이트 단위로 비교합니다. 파일이 어떻게 생겼는지에 대한 추가 지식이 없으면 훨씬 더 효율적으로 처리 할 수 ​​없습니다.

+0

다른 소스에서 높은 througput을 다운로드하므로 중복성이 있습니다. md5sum을 시도 할 것이므로 모든 것에 대한 해시 코드를 얻어야합니다. 작동하는지 알려 드리겠습니다 :-) –

2

가능한 중복 파일 찾기 :

find DIR -type f -exec sha1sum "{}" \; | sort | uniq -d -w40 

지금 당신이 파일이 실제로 동일한 지 확인 cmp를 사용할 수 있습니다.

+0

-w는 gnu uniq의 기능입니다. -d는 연속적인 중복 만 찾을 것이므로 먼저 정렬해야합니다. – hop

+0

맞습니다. 결정된. –

+0

'-w' (GNU에만있는 첫 번째 주석처럼)를 사용하는 대신'sort'의 출력을'-d \ -f 1'로 파이프 처리 한 다음'uniq -d'로 파이프 할 수 있습니다 . 이것은 더 휴대 가능합니다. 그것은 BSD, OS X 및 다른 시스템에서 작동합니다. – monokrome

2

이 조각을 제거하기 전에 모든 복제물을 먼저 가져올 수 있습니다. 배열의

find /path -type f -print0 | xargs -0 sha512sum | awk '($1 in seen){print "duplicate: "$2" and "seen[$1] }(!($1 in seen)){seen[$1]=$2}' 
0

저장 모든 파일 이름은 각 반복 명령 '을 사용하여 다른 파일 내용으로 파일 내용을 비교 .IN 배열을 통과 그 다음 파일을 제거 동일 md5sum'.If 그 때는.

예를 들어 여기서 'b'파일은 'a'파일의 복사본입니다. 따라서 md5sum은 두 파일에서 동일합니다.

+0

특정 접근 방식의 알고리즘 복잡성을 고려하고 싶을 수도 있습니다 ... – hop