여러 폴더의 파일 차이점 확인

여러 폴더의 파일 차이점 확인

백업 시스템 내부의 파일이 다른지 확인하기 위해 스냅샷을 사용하고 싶습니다.

내부에 동일한 스키마를 가진 여러 폴더가 있습니다

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

각 폴더의 파일을 확인해야 합니다.

예를 들어, 목표는 .snapshot/weekly.2024-04-14_0015/my/path/to/the/file.phpweek.2024-04-07_0015/my/path/to/the/file.php 또는 from .snapshot/weekly.2024-03-31_0015/my/path/to/the/file.php, 또는 from .snapshot/weekly.2024-04-07_0015/my/path/to/the/file.php등과 다른지 확인하는 것입니다.

분명히 쉬운 방법이 있습니까?

추신: 이 폴더 내에 변경된 다른 파일/폴더가 있으므로 전체 폴더를 비교할 수는 없습니다.

답변1

쉘 루프의 경우 이것은 생각할 필요도 없는 것처럼 들립니다. 이것은 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

관련 정보