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)?
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
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.