¿Cómo tener el mismo hash de una carpeta en Windows y Linux?

¿Cómo tener el mismo hash de una carpeta en Windows y Linux?

Estaba usando 7zip para calcular el hash de una carpeta (con subcarpetas), lo que puede hacer con dos opciones, incluyendo o sin los nombres de los archivos.

Sin embargo, en la versión Linux de 7zip, la función hash no está implementada. Probé diferentemétodospara duplicar el resultado, pero ninguno de estos métodos daría el mismo resultado en Linux y Windows.

Ejemplos de resultados:

" 7za.exe h -scrcsha1 myfolder" en Windows da:

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

, mientras que en Linux tengo:

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

o

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

Entonces no puedo usar el resultado de una plataforma en otra.

(Verifiqué que el resultado para un solo archivo es el mismo para ambas plataformas).

Respuesta1

Simplemente ejecutar el siguiente comando no necesariamente funcionará:

find . -type f | xargs sha512sum | sha512sum

El problema que puede enfrentar es que el orden de los archivos reportados findes diferente de un sistema a otro o incluso de una copia de directorio a otra.

En su lugar, intente ejecutar lo siguiente:

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

No dude en cambiarlo por sha512sumotro, por ejemplo: md5sum// según sus necesidades.sha1sumsha256sum

Tenga en cuenta que esto puede resultar lento para árboles de directorios grandes, en cuyo caso es posible que prefiera un script más complejo para recorrer la jerarquía.


Ejemplo:

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

Esto incluye nombres de archivos y contenido en el hash final, pero no incluye metadatos: tiempos de modificación, permisos, etc.


Tenga en cuenta que puede utilizar estas utilidades en Windows usando "Subsistema de Windows para Linux". Lo acabo de instalar, lo cual fue una experiencia sencilla y que también me hizo darme cuenta del problema con findlos pedidos informados.

También tenga cuidado con cómo se manejan los enlaces simbólicos en su árbol en Linux frente a Windows.

Respuesta2

Lamentablemente, parece que es imposible reproducir el hash de una carpeta generada por 7-zip.

Esto se debe a que 7z usa la función FindNextFileW() para enumerar los directorios (7z-1900src/CPP/Windows/FileFind.cpp, línea 198).

El orden del valor de retorno de la función no está garantizado y puede depender del sistema de archivos (segúnhttps://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-findnextfilew).

Entonces, si desea implementar una función de hash de directorio independiente de la plataforma, debe utilizar una función de clasificación unificada.

Respuesta3

Como Linux no puede duplicar la suma de comprobación de 7zip y no tengo nodeJS, instalé el "Subsistema de Windows para Linux" para verificar una copia de la carpeta desde una computadora con Windows a un Synology NAS. Instalar WSL fue bastante sencillo, solo sigalos documentos.

Para un comando que realmente generó el mismo hash tanto en Windows como en Linux, me referí principalmente a¿Cómo puedo calcular una suma de comprobación MD5 de un directorio?, que explica cómo ordenar los resultados de manera consistente entre Windows y Linux y también cómo NO ignorar los directorios vacíos. La clasificación consistente se logra con LC_ALL=C:

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

Pero eso no maneja directorios vacíos, por lo que aquí hay un comando más completo copiado de la otra respuesta. No se utiliza -print0para reducir la complejidad, pero Windows no permite nuevas líneas ni caracteres especiales en los nombres de archivos/carpetas, así que no es gran cosa.

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

Por último, Synology crea archivos/carpetas adicionales para indexar, por lo que también tuve que ignorar los archivos indexados con -not -path. Este fue mi comando final que generó la misma suma de comprobación en WSL para mi carpeta de Windows y en Synology SSH para la carpeta copiada:

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

información relacionada