
我想使用快照檢查備份系統內的檔案何時不同。
我有幾個內部具有相同架構的資料夾
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.php
與 week.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
等不同。
有明顯簡單的方法嗎?
PS:此資料夾內還有其他檔案/資料夾發生了更改,我不能只比較整個資料夾。
答案1
對於 shell 循環來說,這聽起來像是一件容易的事。這應該可以在 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