it-swarm-es.com

¿Cómo comparo dos archivos que contienen varias sumas de verificación md5 para determinar los archivos modificados?

Tengo dos archivos MD1 y MD2.

MD1 contiene md5sums:

5f31caf675f2542a971582442a6625f6  /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreator/hash3.txt

donde hash1, hash2 y hash3 son tres archivos presentes en la carpeta md5filescreator.

Del mismo modo MD2 contiene:

163559001ec29c4bbbbe96344373760a  /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreators/hash3.txt

donde estos archivos están en la carpeta md5filescreators.

Quiero comparar las sumas de verificación en md5filescreator con la suma de verificación del archivo correspondiente en md5filecreators.

El script de Shell debería devolver OK para archivos con las mismas sumas de comprobación y FALSE para aquellos que no lo son, junto con los nombres de archivo.

¿Se puede hacer esto usando md5sum --check (ya que normalmente busca cambios en solo 1 archivo MD5)?

6
swapedoc

Quiero saber si esto se puede hacer usando md5sum --check? (ya que normalmente comprueba cualquier cambio en solo 1 archivo MD5).

No, no puede.

md5sum --check está destinado a leer la ruta a cada archivo en la segunda columna de los archivos de entrada y verificar su suma de verificación MD5 contra la suma de verificación informada en la primera columna; Si desea comparar directamente las sumas de verificación en los dos archivos, tendrá que comparar los archivos de texto.

Usando paste + AWK puedes hacer:

paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
  • paste file1 file2: se une a la línea N de file1 en la línea N de file2;
  • awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}': si el primer campo es igual al tercer campo (es decir, las sumas MD5 coinciden), asigna "OK" a x, de lo contrario asigna "FALSE" a x e imprime el segundo campo (es decir, el nombre del archivo) seguido del valor de x.
% cat file1
5f31caf675f2542a971582442a6625f6 /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreator/hash3.txt
% cat file2
163559001ec29c4bbbbe96344373760a /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreators/hash3.txt
% paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
/root/md5filescreator/hash1.txt FALSE
/root/md5filescreator/hash2.txt OK
/root/md5filescreator/hash3.txt OK
5
kos

Una forma simple de verificar esto sería ver qué líneas están no duplicadas en ambos archivos:

sort file1 file2 | uniq --unique

uniq --unique imprime las líneas que no han vuelto a aparecer . En consecuencia, aquellos archivos cuyos hashes coinciden tendrán líneas duplicadas y no aparecerán en la salida. Para probar simplemente si se produce alguna salida, use grep:

sort file1 file2 | uniq --unique | grep -q .

En este caso, dado que los directorios son diferentes, se necesita un poco más de procesamiento:

awk -F/ '{print $1, $NF}' | sort | uniq --unique | awk '!a[$2]++{print $2}'

O, completamente en awk:

awk -F/ 'FNR == NR {hash[$NF] = $1; next} hash[$NF] != $1 {print $NF}'

En ambos casos, obtienes solo los nombres de archivo cuyos hash difieren.

2
muru