¿Es posible ejecutar un comando que solo agregue el sha256 de un archivo si se ha modificado?

1

¿Es posible ejecutar un comando que agregue el sha256 de un archivo en la lista creada anteriormente y solo si se ha modificado de acuerdo con la última fecha registrada en esa lista?

No sé si me entienden. Lo que quiero hacer es crear una lista sha256 de todos los archivos junto con las fechas de modificación.

Entonces, para mantener la lista actualizada, en lugar de revisar todos los archivos (un proceso que llevaría mucho tiempo y uso del disco), necesitaría un comando que compare las fechas de los cambios registrados en la lista creada con la modificación actual Fechas de cada uno de los archivos en el disco. En caso de detectar una modificación, entonces, el programa genera el sha256 del archivo y lo vuelve a registrar en la lista, sobrescribiendo el valor anterior (solo de ese archivo).

¿Hay algún programa que haga esto o alguna idea?

Actualizar:

Lo que necesito es un programa que además de crear el sha, registre a su vez la fecha de modificación que pertenece a cada archivo.

P.ej:

Contenido del archivo database_of_SHA256.txt:

0adca15c96d77a38aa0447fa87af9c297c *document1.txt  2018-12-03 04:12:23
dca15c96d77a9d30d2a7defad30d2a47fa *document2.txt  2018-09-09 10:19:11
77a915c9defad30d2c96d77aa0447fa87a *document3.txt  2017-01-20 17:34:04

El código que debe hacer es, no sé si es el más apropiado, pero debe crear una lista de fechas y nombres de todos los archivos en la computadora y compararlos con estos datos. Si las fechas son diferentes, debe generar y verificar la suma de comprobación.

Si la suma de comprobación no coincide, significa que el archivo realmente se ha modificado y esa lista debe actualizarse con la nueva información (sería bueno pedir una confirmación de esto), si el usuario confirma que desea continuar. , entonces se registra la lista. Nueva fecha y suma de comprobación del archivo.

MarianoM
fuente

Respuestas:

2

Puedes lograrlo fácilmente con un script de shell:

  • Compare la hora de modificación de los archivos con la de la lista (o el punto registrado en el tiempo)
  • Si un archivo es más nuevo que la lista, ejecute sha256sum en él y reemplazar en la lista

Algo a lo largo de las líneas de

HASHCHANGED=$(stat -c '%Y' "/path/to/listfile") # Or extract the timestamp from the list
for FILE in /path/to/files/* ; do
  FILECHANGED=$(stat -c '%Y' "$FILE")
  if test $FILECHANGED -ge $HASHCHANGED; then
    NEWHASH=$(sha256sum "$FILE")
    # put the hash into your list, this depends on the list format
  fi
done

EDITAR

Por los comentarios, entiendo, que no hay un formato de lista predefinido, como había asumido en la OQ. Esto hace que sea natural utilizar el estándar. sha256sum formato. Ahora podemos expandir el script desde arriba a una solución completa:

# Configuration
HASHFILE="/path/to/hashfile"
FILEMASK="/path/to/files/*.suffix"

HASHCHANGED=$(stat -c '%Y' "$HASHFILE")
while read FILE ; do
  test -f "$FILE" || continue
  FILECHANGED=$(stat -c '%Y' "$FILE")
  if test $FILECHANGED -ge $HASHCHANGED; then
    NEWHASH=$(sha256sum "$FILE")
    cat "$HASHFILE" | grep -ve "\\s$FILE\$" > "$HASHFILE.tmp"
    echo "$NEWHASH" >> "$HASHFILE.tmp"
    cat "$HASHFILE.tmp" | sort -u > "$HASHFILE"
  fi
done < <(eval "ls -1 $FILEMASK") #Need an eval here to allow * in mask

Debes sembrar la lista inicial con sha256sum /path/to/files/*mask

Eugen Rieck
fuente
Interesante para quien sabe pero no para novatos como yo. Todavía no sé cómo crear la lista con las fechas de cada archivo y no entiendo dónde agregar la lista en su código; No tienes la culpa de que yo pregunte esto jaja. Intentaré aprender más sobre el código y ver si puedo lograrlo.
MarianoM
@MarianoM ve mi edición
Eugen Rieck
Gracias Eugen! Después de intentar hacer que funcionara y probarlo línea por línea porque el script estaba congelado, analicé su código de acuerdo con mi conocimiento limitado, y me di cuenta de que está comparando la fecha del archivo hash y lo que necesito es que compare la fecha registrada en la lista con la fecha del archivo. Si la fecha es diferente, la nueva suma de comprobación se genera y registra en la lista junto a la fecha actualizada.
MarianoM
Puede que hayas entendido mal al traductor. Mientras que en mayúsculas no funciona y lo hecho me da un error inesperado, lo he intentado de varias maneras y línea por línea, solo en que recibo un error.
MarianoM
Agregue algunos detalles para ver si se entiende mejor.
MarianoM