¿Existe alguna forma de buscar archivos por valor hash?

¿Existe alguna forma de buscar archivos por valor hash?

¿Hay alguna manera de tener un valor hash como entrada cuando busco archivos y una lista completa de archivos y sus ubicaciones como salida?

Esto podría resultar útil al intentar localizar archivos duplicados. Muchas veces me encuentro en situaciones en las que tengo un montón de archivos que sé que ya tengo almacenados en alguna ubicación pero no sé dónde. Son esencialmente duplicados.

Por ejemplo, podría tener un montón de archivos en un disco duro portátil y también copias impresas de esos archivos en el disco duro interno de una computadora de escritorio... ¡pero no estoy seguro de su ubicación! Ahora bien, si no se cambia el nombre de los archivos, podría hacer una búsqueda por nombre de archivo para intentar localizar la copia impresa en el escritorio. Luego podría compararlos uno al lado del otro y en caso de que sean iguales podría eliminar la copia que tengo en el disco duro portátil. Pero si se ha cambiado el nombre de los archivos en cualquiera de los discos duros, esto probablemente no funcionará (dependiendo de cuánto difieran los nuevos nombres del original).

Si se cambia el nombre de un archivo, pero no se edita, podría calcular su valor hash, por ejemplo, el valor SHA1 es 74e7432df4a66f246b5214d60b190b67e2f6ce52. Luego, me gustaría tener este valor como entrada al buscar archivos y hacer que el sistema operativo busque en un directorio determinado o en todo el sistema de archivos archivos con este valor hash SHA1 exacto y genere una lista completa de ubicaciones donde se almacenan estos archivos.

Estoy usando Windows, pero en general me interesa saber cómo se podría lograr algo como esto, independientemente del sistema operativo.

Respuesta1

Ejemplo de Linux:

hash='74e7432df4a66f246b5214d60b190b67e2f6ce52'
find . -type f -exec sh -c '
   sha1sum "$2" | cut -f 1 -d " " | sed "s|^\\\\||" | grep -Eqi "$1"
' find-sh "$hash" {} \; -print

Este código es más complejo de lo que crees que debería ser porque:

  • está destinado a manejar correctamente nombres de archivos con espacios, nuevas líneas, barras invertidas, comillas, caracteres especiales, etc. (cambie -printa -print0para analizarlos más a fondo);
  • está destinado a aceptar hash(es) como expresiones regulares (compatibles con grep -Eie egrep),
    por ejemplo , '^00|00$'coincidirá si el hash del archivo comienza o termina con 00; un ejemplo más práctico es la búsqueda por muchos hashes a la vez: '74…|a9…|…|…|…'(elipsas para mayor brevedad, use hashes completos).

Puede utilizar otras *sumherramientas con interfaz compatible (p. ej md5sum.).

Respuesta2

Si tiene PowerShell v.4.0 o superior, puede usar el comando:

Get-ChildItem _search_location_ -Recurse | Get-FileHash | 
Where-Object hash -eq (Get-FileHash _search_file_).hash | Select path

¿Dónde _search_location_está la carpeta o el disco donde desea buscar un duplicado y _search_file_es un archivo que tiene un duplicado en alguna parte? Puede poner este comando en un bucle para buscar varios archivos o agregarlo | Remove-Itemal final de la línea para eliminar automáticamente los duplicados.

También tenga en cuenta que este comando es adecuado sólo para carpetas de búsqueda pequeñas; llevará mucho tiempo si su ubicación de búsqueda tiene miles de archivos (como un disco duro completo).

Respuesta3

Esta es una pregunta intrigante. He estado usando una herramienta llamada fdupes para lograr algo similar. Fdupes buscará recursivamente en directorios y comparará cada archivo con todos los demás. Primero compara el tamaño, y si los tamaños son idénticos, entonces crea hashes de los archivos y los compara, si los hashes son los mismos, entonces revisa cada archivo byte por byte y lo compara.

Cuando encuentre todos los archivos que sean realmente idénticos, podrá hacer varias cosas. Le pido que elimine el duplicado y cree un vínculo físico en su lugar (ahorrándome así espacio en el disco duro), aunque puede hacer que simplemente genere las ubicaciones de los archivos duplicados y no haga nada con ellos. Este es el escenario sobre el que estás preguntando.

Algunas desventajas de fdupes son que, hasta donde yo sé, es solo Linux y, dado que compara cada archivo con todos los demás, requiere bastante E/S y tiempo para ejecutarse. No "busca" un archivo por ejemplo, pero enumera todos los archivos que tienen un hash idéntico.

Lo recomiendo encarecidamente y lo configuro para que se ejecute en una tarea cron todos los días para nunca tener duplicados innecesarios de mis datos (excluye mis copias de seguridad, por supuesto).

Página fuente de Fdupes

Respuesta4

Voidtools Todo 1.5 (Alfa)La herramienta de búsqueda para Windows tiene una opción para agregar una columna de varios hashes, como CRC-32, CRC-64, MD5, SHA-1, SHA-256 para cada archivo.

ingrese la descripción de la imagen aquí

Luego también puedes buscar un hash en particular, por ejemplomd5:71E.. ingrese la descripción de la imagen aquí

información relacionada