Windows と Linux 上のフォルダーから同じハッシュを取得するにはどうすればよいでしょうか?

Windows と Linux 上のフォルダーから同じハッシュを取得するにはどうすればよいでしょうか?

私は 7zip を使用してフォルダー (サブフォルダーを含む) のハッシュを計算していましたが、これはファイル名を含めるか含めないかの 2 つのオプションで実行できます。

しかし、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 つのファイルの結果が両方のプラットフォームで同じであることを確認しました。)

答え1

次のコマンドを単に実行しても、必ずしも機能するとは限りません。

find . -type f | xargs sha512sum | sha512sum

発生する可能性がある問題は、によって報告されるファイルの順序がfindシステムごとに、またはディレクトリのコピーごとに異なることです。

代わりに、以下を実行してみてください。

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

必要に応じて、自由にsha512sum別のものに交換してください (例: md5sum// sha1sum) 。sha256sum

ただし、ディレクトリ ツリーが大きい場合は処理が遅くなる可能性があるので、その場合は階層をトラバースするためのより複雑なスクリプトを使用する方がよいかもしれません。


例:

$ 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へのフォルダコピーを検証するために「Windows Subsystem for Linux」をインストールしました。WSLのインストールは非常に簡単で、次の手順に従ってください。ドキュメント

WindowsとLinuxの両方で実際に同じハッシュを生成するコマンドについては、主にディレクトリの MD5 チェックサムを計算するにはどうすればよいですか?では、Windows と Linux 間で結果を一貫して並べ替える方法と、空のディレクトリを無視しない方法について説明しています。一貫した並べ替えは、次のようにして実現されますLC_ALL=C

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

しかし、これは空のディレクトリを処理しないので、他の回答からコピーしたより完全なコマンドを次に示します。複雑さを軽減するために使用されません-print0が、Windows ではファイル名やフォルダ名に改行や特殊文字を使用できないため、大きな問題にはなりません。

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

関連情報