Windows 및 Linux의 폴더에서 동일한 해시를 갖는 방법은 무엇입니까?

Windows 및 Linux의 폴더에서 동일한 해시를 갖는 방법은 무엇입니까?

저는 7zip을 사용하여 폴더(하위 폴더 포함)의 해시를 계산했는데, 이는 파일 이름을 포함하거나 포함하지 않고 두 가지 옵션으로 수행할 수 있습니다.

그러나 Linux 버전의 7zip에서는 해시 기능이 구현되지 않습니다. 나는 다르게 시도했다행동 양식결과를 복제하려면 이러한 방법 중 어느 것도 Linux와 Windows에서 동일한 결과를 제공하지 않습니다.

결과 예:

7za.exe h -scrcsha1 myfolderWindows의 " "는 다음을 제공합니다.

SHA1   for data:              D54D3168B16BFEE600C3A77E848A2A1C1DBCBC59
SHA1   for data and names:    BCE55085200581AD1774CC25AE065DE7DE60077D

, Linux에서는 다음이 있습니다.

find . -type f -exec sha1sum "$PWD"/{} \; | sha1sum
ee44137f2462bdfea87ec824dab514f288ae3e6c  -

또는

find . -type f | xargs sha1sum | sha1sum
8f971311a28bcdee36fab0ce87a892564622db40  -

따라서 한 플랫폼의 결과를 다른 플랫폼에서 사용할 수 없습니다.

(단일 파일의 결과가 두 플랫폼 모두에서 동일한지 확인했습니다.)

답변1

단순히 다음 명령을 실행한다고 해서 반드시 작동하는 것은 아닙니다.

find . -type f | xargs sha512sum | sha512sum

직면할 수 있는 문제는 보고된 파일의 순서가 find시스템 간 또는 디렉터리 복사 간과 다르다는 것입니다.

대신 다음을 실행해 보세요.

find . -type f | sort | xargs sha512sum | sha512sum

자유롭게 다른 것으로 교체하세요 - sha512sum예: md5sum// 요구 사항에 따라.sha1sumsha256sum

대규모 디렉터리 트리의 경우 속도가 느려질 수 있으며, 이 경우 계층 구조를 탐색하기 위해 더 복잡한 스크립트를 선호할 수 있습니다.


예:

$ find . -type f | xargs sha512sum | sha512sum
097e56f6b751c1da15ce5b9dce853ffcc89e06e9cbe10a8dc0894dedb834d40dc4228c65e48bd53f136dd6a7700b0ab07e8e12e7100956db00b0d1b9ef0b9956  -

여기에는 최종 해시의 파일 이름과 콘텐츠가 포함되지만 메타데이터(수정 시간, 권한 등)는 포함되지 않습니다.


"를 사용하여 Windows에서 이러한 유틸리티를 사용할 수 있습니다.Linux용 Windows 하위 시스템". 방금 설치했는데, 이는 고통스럽지 않은 경험이었고 find의 보고된 주문에 대한 문제도 깨달았습니다.

또한 Linux와 Windows의 트리에서 기호 링크가 어떻게 처리되는지 주의 깊게 살펴보세요.

답변2

안타깝게도 7-zip으로 생성된 폴더의 해시를 재현하는 것은 불가능한 것 같습니다.

이는 7z가 FindNextFileW() 함수를 사용하여 디렉터리(7z-1900src/CPP/Windows/FileFind.cpp, 198행)를 열거하기 때문입니다.

함수의 반환 값 순서는 보장되지 않으며 파일 시스템에 따라 달라질 수 있습니다.https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-findnextfilew).

따라서 플랫폼 독립적인 디렉터리 해싱 기능을 구현하려면 통합 정렬 기능을 사용해야 합니다.

답변3

Linux는 7zip 체크섬을 복제할 수 없고 nodeJS가 없기 때문에 Windows 컴퓨터에서 Synology NAS로의 폴더 복사를 확인하기 위해 "Linux용 Windows 하위 시스템"을 설치했습니다. WSL 설치는 매우 간단했습니다. 그냥 따르세요.문서.

Windows와 Linux 모두에서 실제로 동일한 해시를 생성한 명령에 대해서는 주로 다음을 참조했습니다.디렉토리의 MD5 체크섬을 어떻게 계산합니까?, Windows와 Linux 간에 결과를 일관되게 정렬하는 방법과 빈 디렉터리를 무시하지 않는 방법을 설명합니다. 일관되게 정렬하는 방법은 다음과 같습니다 LC_ALL=C.

find . -type f -print0 | LC_ALL=C sort -z | xargs -r0  sha512sum | sha512sum

그러나 이는 빈 디렉토리를 처리하지 않으므로 여기에 다른 답변에서 복사한 보다 완전한 명령이 있습니다. 복잡성을 줄이기 위해 사용되지는 않지만 -print0Windows에서는 파일/폴더 이름에 개행 및 특수 문자를 허용하지 않으므로 별 문제가 되지 않습니다.

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

마지막으로 Synology는 인덱싱을 위해 추가 파일/폴더를 생성하므로 -not -path. 이것은 내 Windows 폴더에 대해 WSL에서, 복사된 폴더에 대해 Synology SSH에서 동일한 체크섬을 생성한 마지막 명령입니다.

dir=.; (find "$dir" -type f -not -path '*@eaDir*' -exec sha512sum {} +; find "$dir" -type d -not -path '*@eaDir*') | LC_ALL=C sort | sha512sum

관련 정보