• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

¿Algún generador de listas de hash por comandos para imágenes que sea muy rápido?

Elaphe

De profesión Chapuzas
Registrado
8 Mar 2016
Mensajes
370
Puntos
43
Por el momento estoy usando md5sums a través de un script para generar un listado de ficheros con su hash, de manera que luego desde otro script se ejecuta el md5sums sobre una imagen en concreto y comprueba el listado completo para verificar si la imagen (aunque tenga otro nombre) está presente o no. El problema es que la creación de dicho listado tarda una eternidad (son miles de imágenes). Me pregunto si conocéis alguna otra utilidad que funcione igualmente por comandos pero que sea mucho más rápida, quizás creando información más sencilla o leyendo solo una pequeña parte de cada imagen para agilizar el proceso.
 
El proceso de calcular el hash de un fichero es lento porque hay que leer todo el fichero para ello. Da igual qué hash utilices, el mayor coste en el caso que planteas se encuentra en leer todos los ficheros, por lo que elegir otro hash más rápido no va a servir. El MD5 ya es muy rápido, de hecho.

¿Solución? Mover las imágenes a un medio más rápido 😛

Lo que planteas de leer sólo parte (por ejemplo, metadatos) no lo he probado. Diría, no obstante, que no te servirá para lo que quieres, aunque puedes intentarlo. Si la cantidad de imágenes es realmente elevada podrías intentar paralelizarlo de alguna manera. Si son muchos pero muy pequeños, el mayor coste no reside en la lectura secuencial sino el acceso aleatorio a los ficheros, apertura, actualización de inodos, etc. ¿De cuántos datos estamos hablando? ¿Cuánto peso en total? ¿Cuánto por fichero?

Con imágenes, no obstante, pasa que cada vez que una imagen es reenviada o guardada mediante algún programa (WhatsApp), éstos dejan una marca en el fichero, modificándolo y haciendo que el hash cambie, por lo que técnicamente aun comprobando los hash no estás eliminando "las mismas" imágenes, sino los mismos ficheros.

¿Solución a eso? Computer vision, aunque entiendo que se sale del objetivo inicial.
 
Después de darle vueltas al coco, he pensado en una solución que creo que me puede servir. Hago un listado de ficheros con sus tamaños usando el comando forfiles, lo cual tarda unos pocos minutos en comparación con las horas que se lleva hacer el hash a todas las imágenes. Mi script buscará el tamaño de la imagen seleccionada dentro de ese listado, cosa que se hace de forma muy rápida. Si encuentra uno o varios ficheros del mismo tamaño, les hace el md5 a la imagen y a los ficheros (en un puñado de ficheros es un momento), los compara y me dice si hay coincidencia.
 
Después de darle vueltas al coco, he pensado en una solución que creo que me puede servir. Hago un listado de ficheros con sus tamaños usando el comando forfiles,
¿forfiles?, vaya, pensaba, igual que el compañero que te ha respondido, de que usabas Linux.
Nada como el comodín & para ejecutar un script en 2º plano en Linux, su equivalente en Windows es el comando START.
 
Última edición:
No, estoy en Windows 10. Al final voy a dejar el sistema antiguo del hash. Esta noche lo he dejado haciéndolo y se ha llevado varias horas pero lo ha completado. Tengo que mirar a ver si encuentro algún programa para hacerlo pero que sea de forma incremental, no partiendo de cero cada vez. Sería algo así como un programa de sincronización de ficheros, que te examina la ruta y te dice los ficheros que son nuevos, los que se han borrado o han cambiado (por fecha o tamaño), y complete la lista en función a eso.
 
Lo que planteas no es difícil. En linux puedes conseguirlo juntando unos pocos comandos en un script (cut, el comando de hash, ls, grep, sed), y aunque en Windows no puedo ayudarte porque estoy pez en scripting con ese sistema, supongo que el planteamiento podría valer igual.

Puedes intentar algo así... Primero, genera una base de datos en texto plano con el siguiente formato: nombre-del-fichero.jpg;HASH, una línea por cada fichero. Luego, haz un script que compare el estado actual del directorio contra ese fichero.

Esto lo puedes conseguir con los comandos ls y grep (listas los archivos del directorio, y para cada uno compruebas si está en el fichero). Si no está en el fichero, es nuevo, por lo tanto puedes ejecutar $ echo "nombre-del-fichero.jpg;$(hash nombre-del-fichero.jpg)" >> basededatos (o algo así, tendría que probarlo) para añadirlo. En el sentido contrario, itera sobre cada línea de ese fichero (puedes obtener el nombre de fichero con $ cut -f1 -d";"), y para cada uno comprueba de forma parecida si está o no dentro de los ficheros que devuelve el comando ls. Si no está, puedes eliminarlo de la base de datos, si es que quieres hacerlo, con el comando sed.

No es difícil y este mismo plan lo he tenido funcionando para otras cosas, aunque hace tiempo que no.
 
Última edición:
A la propuesta del compañero añadiría en la base de datos la fecha completa cuando se hizo el hash
nombre-del-fichero.jpg;HASH;fecha-completa

Y también usaría la fecha del archivo para compararlo con esa fecha, si es superior es que se ha modificado y se generaría un nuevo hash. Usaría el comando stat
PHP:
stat repositorios_Leap_15_0.txt 
  Fichero: repositorios_Leap_15_0.txt
  Tamaño: 5197          Bloques: 16         Bloque E/S: 4096   fichero regular
Dispositivo: 803h/2051d Nodo-i: 61831591    Enlaces: 1
Acceso: (0644/-rw-r--r--)  Uid: ( 1000/  leches)   Gid: (  100/   users)
      Acceso: 2020-02-01 11:19:35.182610552 +0100
Modificación: 2020-01-19 12:19:52.000000000 +0100
      Cambio: 2020-01-19 16:04:08.184301261 +0100
    Creación: -
O el comando find para buscar a partir de una fecha: Linux Find Files By Date And List Files Modified On a Specific Date - nixCraft

A mí me pasa lo mismo, estoy pez con los scripts de Windows, donde conozco el tema son los de linux.
 
Última edición:
Hola, perdon por el offtopic, pero me interesa ese tipo de script para archivos stl y rar(con stl dentro), la cuestion es que tengo unos 6tb de stls y me da que unos cuantos son el mismo archivo renombrado, se podria aplicar ese tipo de script a mi caso? perdon de nuevo por le offtopic y si alguien me puede echar un cable lo agradezco, un saludo!
 
Hola, perdon por el offtopic, pero me interesa ese tipo de script para archivos stl y rar(con stl dentro), la cuestion es que tengo unos 6tb de stls y me da que unos cuantos son el mismo archivo renombrado, se podria aplicar ese tipo de script a mi caso? perdon de nuevo por le offtopic y si alguien me puede echar un cable lo agradezco, un saludo!
En linux existen comandos para ese cometido:
 
Gracias por las ideas. Todo eso que comentáis puedo hacerlo sin problemas en AutoHotkey.
 
Arriba