comprobar la diferencia de archivos con varias carpetas

comprobar la diferencia de archivos con varias carpetas

Me gustaría comprobar cuándo un archivo difiere dentro de un sistema de copia de seguridad mediante instantáneas.

Tengo varias carpetas con la misma arquitectura dentro

ls -1 .snapshot
4-hourly.2024-04-14_0405
4-hourly.2024-04-14_0805
4-hourly.2024-04-14_1205
4-hourly.2024-04-14_1605
4-hourly.2024-04-14_2005
4-hourly.2024-04-15_0405
4-hourly.2024-04-15_0805
4-hourly.2024-04-15_1205
daily.2024-04-08_0010
daily.2024-04-09_0010
daily.2024-04-10_0010
daily.2024-04-11_0010
daily.2024-04-12_0010
daily.2024-04-13_0010
daily.2024-04-14_0010
daily.2024-04-15_0010
monthly.2024-01-01_0020
monthly.2024-02-01_0020
monthly.2024-03-01_0020
monthly.2024-04-01_0020
weekly.2024-02-25_0015
weekly.2024-03-03_0015
weekly.2024-03-10_0015
weekly.2024-03-17_0015
weekly.2024-03-24_0015
weekly.2024-03-31_0015
weekly.2024-04-07_0015
weekly.2024-04-14_0015

Y tengo que verificar un archivo ubicado dentro de cada una de estas carpetas.

Por ejemplo, el objetivo es ver si .snapshot/weekly.2024-04-14_0015/my/path/to/the/file.phpdifiere de semanalmente.2024-04-07_0015/my/path/to/the/file.php o de .snapshot/weekly.2024-03-31_0015/my/path/to/the/file.php, o de, .snapshot/weekly.2024-04-07_0015/my/path/to/the/file.phpetc.

¿Existe una forma sencilla y obvia para esto?

PD: Hay otros archivos/carpetas que cambiaron dentro de esta carpeta y no puedo simplemente comparar toda la carpeta.

Respuesta1

Suena como un trabajo fácil para un bucle de shell. Esto debería funcionar en zsh, bash, dash…

cd .snapshot
original="weekly.2024-04-14_0015/my/path/to/the/file.php"
pathonly="$(echo "${original}" | sed 's;^[^/]*/\(.*\)$;\1;')" # cut off head directory

orig_hash=$(sha1sum "${original}" | sed 's/^\([^ ]*\) .*$/\1/')

for candidate in */"${pathonly}" ; do
  # don't compare file to itself, that'd be silly
  [[ "${candidate}" = "${original}" ]] && continue 

  cand_hash=$(sha1sum "${candidate}" | sed 's/^\([^ ]*\) .*$/\1/')

  # check hashes, so that we don't have to read the original N times
  ( [[ "${orig_hash}" = "${cand_hash}" ]] && \
  # if the hashes match, use the cmp tool to compare files byte by byte
    cmp -- "${candidate}" "${original}" ) || \
    # if either the hash equality or the content equality fail, print file name
    printf '%s differs\n' "${candidate}"
done

información relacionada