我想测试我正在创建的流程每次是否产生相同的输出。
我想通过创建文件夹内容的哈希来实现这一点。但这不应考虑文件修改时间或任何 .DS_Store/thumbs.db 类型的文件。
我怎样才能做到这一点?
答案1
我认为您的意思是有一个考虑目录中所有文件的单一哈希。
find . -name thumbs.db -prune -o -type f -exec cat {} \; | shasum -
注意我首先尝试使用 tar,但大多数存档格式都包含时间戳,因此不会给您想要的结果。
为了测试这一点,我选择了一个源目录并为其生成了 sha,如下所示。请注意,我缩短了生成此示例的 sha 的命令,仅当您需要排除某些文件时才使用“-name thumbs.db -prune -o”。
$ find Temp\ 20060810/ -type f | wc -l
7207
$ du -hs Temp\ 20060810/
3.6G Temp 20060810/
$ (cd ../Temp\ 20060810/ && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646 -
然后我使用不同的技术创建了一些副本:
$ cp -r Temp\ 20060810/ ~/tmp/TEST1
$ (cd Temp\ 20060810/ && tar -cf - .) | (mkdir ~/tmp/TEST2 && tar -C ~/tmp/TEST2 -xf - )
$ rsync -a Temp\ 20060810/ ~/tmp/TEST3/
$ cp -aL Temp\ 20060810/ ~/tmp/TEST4/
最后,将副本的哈希值与原始文件的哈希值进行比较:
$ (cd ~/tmp/TEST1 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646 -
$ (cd ~/tmp/TEST2 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646 -
$ (cd ~/tmp/TEST3 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646 -
$ (cd ~/tmp/TEST4 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646 -