文件夹是否有 MD5(或类似的)?如何验证两个文件夹是否相等?

文件夹是否有 MD5(或类似的)?如何验证两个文件夹是否相等?

我想找到md5sum一个文件夹(或类似的计算结果),而不将其压缩到存档中。

例如,如果在文件夹中MyFolder我们有文件1.txt2.txt3.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

相关内容