md5는 파일의 처음 512바이트만 해시합니다.

md5는 파일의 처음 512바이트만 해시합니다.

배경

기존 NAS에서 새 NAS로 파일을 마이그레이션하려고 하며 데이터 무결성을 확인하고 싶습니다. 이전 NAS(Debian)는 Linux Ext3 파일 시스템을 사용하는 반면, 새로운 NAS(FreeNAS)는 ZFS를 기반으로 합니다. 무결성 검증 속도를 높이기 위해 분류 방법을 사용해 보았습니다.

  • 먼저 모든 파일 크기를 확인하세요.
  • 두 번째로 md5는 각 파일의 처음 512바이트를 해시합니다.
  • 마지막으로 md5는 전체 파일을 해시합니다.

아이디어는 처음 두 단계가 명백하게 손상된 파일을 필터링하고 테라바이트 파일에서 일괄적으로 md5를 실행하는 것보다 훨씬 빠르게 검색한다는 것입니다.

질문

저는 디렉터리 구조의 md5 해시를 수행하고 파일 이름을 기준으로 출력을 정렬하여 Linux NAS에서 결정적인 순서를 보장하는 bash 명령을 만들었습니다.

#find somedir -type f -exec md5sum {} \; | sort -k 34;
12e761f96223145aa63f4f48f252d7fb  /somedir/foo.txt
18409feb00b6519c891c751fe2541fdc  /somedir/bar.txt

하지만 각 파일의 처음 512바이트만 md5하려는 경우 위 내용을 어떻게 수정할 수 있습니까?

답변1

처음 dd512 바이트 를 md5sum.md5sum-

find . -type f -exec sh -c "dd if={} bs=512 count=1 2>/dev/null | md5sum | sed s\|-\|{}\|" \; | sort -k 34;

답변2

허용되는 답변이 나에게 적합하지 않습니다. 특수 문자가 포함된 파일의 경우 내부적으로 {}실패합니다 exec. 그래서 대신 GNU를 사용했습니다 parallel(다음 솔루션이 작동하도록 최신 버전을 설치).

를 사용하면 parallel특수 {}문자가 포함된 파일에 대해 잘못된 동작이 발생하지 않습니다. 또한 parallel프로세스를 여러 코어에 분산시키기 때문에 전체 프로세스가 더 빨라집니다. 이것이 나를 위해 일한 것입니다 parallel.

find . -type f | parallel 'dd if={} bs=512 count=1 2>/dev/null | md5sum | tr -d "\n"; echo {};' | sort -k34;

관련 정보