我想比较本地文件夹和服务器上的文件夹,文件夹可以包含子文件夹,子文件夹可以包含文件。
如何计算整个文件夹的 md5sum?
更新:
一种可能的解决方案不是计算整个文件夹的哈希值,而是计算每个文件的哈希值,然后比较哈希值列表。
假设我们要比较文件夹a
和b
:
tree .
.
├── a
│ ├── 1.txt
│ └── d
│ └── 2.txt
└── b
└── 1.txt
这可以显示出差异:
find a -type f | sort | xargs md5 -r | cut -f1 -d " " > a.txt
find b -type f | sort | xargs md5 -r | cut -f1 -d " " > b.txt
git diff --no-index a.txt b.txt
但是如何检查哪个文件对应于某个文件夹中缺少的哈希值?
如果我
cd a
find . -type f | sort | xargs md5 -r > ../a.txt
cd ..
cd b
find . -type f | sort | xargs md5 -r > ../b.txt
cd ..
git diff --no-index a.txt b.txt
这解决了一个问题,但可能不太优雅。
答案1
其他答案中使用 zip 的解决方案看起来不错,但对我来说有一些缺点,它需要压缩文件,不显示哪个文件不同。
因此,我将提供一个示例解决方案:
cd /target/directory
md5sum * >/tmp/tmp_file
如果你有子目录和文件,并且想包含这些文件,请使用
cd /target/directory
find . -type f -exec md5sum {} \; >/tmp/tmp_file
转移tmp_file
到其他服务器并在那里执行
cd /remote_target/directory
md5sum -c /tmp/tmp_file
(如果tmp_file
在目录中传输/tmp
)你会看到如下输出:
[root@rh1 sssd]# md5sum -c /tmp/a
./sssd.log: OK
./sssd_implicit_files.log: OK
./sssd_nss.log: OK
./a/aa: OK
答案2
使用 rhash 将 md5 哈希值输出到文件。
$ rhash -Mr -o /path/to/md5sum .
验证文件的哈希值。
$ rhash -c /path/to/md5sum
拉什选项:
-M
MD5:计算并打印 MD5 哈希值。-r
递归处理命令行指定的目录。-o
设置文件以输出计算的哈希值和验证结果。-c
检查命令行指定的哈希文件。
将目录结构保存到同一个文件。
$ find -type d -printf "; %P\n" >> /path/to/md5sum1
逐行比较文件。
$ diff md5sum1 md5sum2