![文件夹是否有 MD5(或类似的)?如何验证两个文件夹是否相等?](https://linux22.com/image/18339/%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E5%90%A6%E6%9C%89%20MD5%EF%BC%88%E6%88%96%E7%B1%BB%E4%BC%BC%E7%9A%84%EF%BC%89%EF%BC%9F%E5%A6%82%E4%BD%95%E9%AA%8C%E8%AF%81%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E5%90%A6%E7%9B%B8%E7%AD%89%EF%BC%9F.png)
我想找到md5sum
一个文件夹(或类似的计算结果),而不将其压缩到存档中。
例如,如果在文件夹中MyFolder
我们有文件1.txt
、2.txt
和3.txt
,包含:
1.txt
将文本写入1.txt
2.txt
将文本写入2.txt
3.txt
将文本写入3.txt
我怎样才能计算md5sum
出这整个的MyFolder
?有办法吗?我想用它来验证两个文件夹是否具有相同的内容。
这可用于验证两个 CD 或文件夹是否相同。我想要一个简单的方法来做到这一点。
答案1
这md5深工具正是为此目的而开发的。许多 Linux 发行版都以软件包的形式提供它。
答案2
如果你不想存档,也许你可以这样做
diff <(find folder1) <(find folder2)
您可能需要调整find
命令以使其更加准确。
编辑
您可以添加-exec
到 find 调用中来比较文件的内容。与此类似的东西:
diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)
请记住,您可能想要调整这一点。
答案3
一种测试方法是根据文件夹及其子文件夹中所有文件的串联生成 md5sum。请记住,这还要求文件具有相同的名称(因为它们必须具有相同的排序顺序)。以下代码应该可以工作:
#!/bin/bash
shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }
for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done
(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }
_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)
{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }
如果您真正关心文件名等,您可以使用循环来比较${_files_in_old_dir}
和中的内容${_files_in_new_dir}
。这应该适用于大多数情况(它至少检查目录及其子目录中的文件数量)。
答案4
如果您想检查递归地两个目录之间的差异/path1
和/path2
没有使用md5deep
:
diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)
解释:
- 使
path1
打印的所有行都find
相对于path1
(cd /path1
) - 列出所有文件在当前路径中递归 (
&& find . -type f
) - 使用每行输出作为
find
(md5
)| xargs md5
的输入
如果有任何差异,输出将如下所示:
< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78