我该如何计算目录的MD5校验?(How can I calculate an md5 checksu

2019-09-03 10:48发布

我需要计算汇总MD5校验特定类型(所有文件*.py一个目录及其所有子目录下放置的例子)。

什么是做到这一点的最好方法是什么?

编辑:提出的解决方案是非常好的,但是这不正是我需要的。 我正在寻找一个解决方案,以得到一个简要的校验和,这将唯一地标识目录作为一个整体-包括它的所有子目录的内容。

Answer 1:

find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum

find命令列出所有在的.py结尾的文件。 md5sum也计算每个.py文件。 AWK用于摘掉MD5SUMS(忽略文件名,这可能不是唯一的)。 与MD5SUMS进行排序。 那么这个排序列表的md5sum也被返回。

我已经通过复制一个测试目录测试这样的:

rsync -a ~/pybin/ ~/pybin2/

我改名的一些文件在〜/ pybin2。

find...md5sum命令返回两个目录相同的输出。

2bcf49a4d19ef9abd284311108d626f1  -


Answer 2:

即时创建和管道,为tar归档文件md5sum

tar c dir | md5sum

这将产生一个单一的md5sum应该是唯一的,您的文件和子目录设置。 没有文件在磁盘上创建。



Answer 3:

ire_and_curses的使用建议, tar c <dir>有一些问题:

  • 焦油处理它们被存储在文件系统中的顺序目录条目,有没有办法改变这个顺序。 这实际上可以产生完全不同的结果,如果你有不同的地方“相同”的目录,我知道没有办法解决这个问题(焦油不能“排序”的投入,以特定的顺序文件)。
  • 我平时关心groupId和OWNERID号码是否相同,组/所有者的字符串表示不一定是否相同。 这是符合什么例如rsync -a --delete的作用:它几乎同步一切(减xattrs和ACL),但它会根据自己的ID同步所有者和组,而不是字符串表示。 所以,如果你同步到不同的系统,这并不一定有相同的用户/组,你应该添加--numeric-owner标志焦油
  • 焦油会包括你正在检查自己的目录文件名,只是要注意的。

只要有第一个问题没有修复(或除非你确定它不会影响你),我不会使用这种方法。

find上述提出的基于解决方案也是白搭,因为他们只包括文件,而不是目录,成为你的校验应该牢记空目录的问题。

最后,大多数建议的解决方案不排序一致,因为整理可能是跨系统不同。

这是我想出了解决方案:

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

说明这个解决方案:

  • 所述LC_ALL=C是确保跨系统可靠排序顺序
  • 这并不目录“命名\ nwithanewline”和两个目录“命名”和“withanewline”区分开来,但发生的历史的机会似乎不太可能。 人们通常修复了这个与-print0为标志find ,但因为有其他的东西会在这里,我只能看到的解决方案,这将使该命令的更多复杂那么它的价值。

PS:我的一个系统使用有限的busybox的find它不支持-exec也不-print0标志,并且还附加“/”表示目录,而发现的findutils好像没有,所以这台机器,我需要运行:

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum

幸运的是,我有一个在他们的名字换行没有文件/目录,所以这不是系统的问题。



Answer 4:

如果你只关心文件,而不是空目录,这很好地工作:

find /path -type f | sort -u | xargs cat | md5sum


Answer 5:

为了完整性的缘故,有md5deep(1) ; 它不能直接适用,由于*的.py过滤器的要求,但应与find(1)做精在一起。



Answer 6:

一个解决方案,它的工作最适合我:

find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum

之所以它的工作最适合我:

  1. 处理包含空格的文件名
  2. 忽略文件系统元数据
  3. 如果检测到的文件已被重命名

与其他答案的问题:

文件系统元数据是不是忽略:

tar c - "$path" | md5sum

不处理包含空格的文件名,也没有检测,如果文件被重命名:

find /path -type f | sort -u | xargs cat | md5sum


Answer 7:

如果你想要一个跨越的md5sum整个目录,我会做类似

cat *.py | md5sum 


Answer 8:

校验所有文件,包括内容和它们的文件名

grep -ar -e . /your/dir | md5sum | cut -c-32

同上,但只包括* .py文件

grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32

您也可以跟随符号连接,如果你想

grep -aR -e . /your/dir | md5sum | cut -c-32

其他选项,你可以考虑使用grep使用

-s, --no-messages         suppress error messages
-D, --devices=ACTION      how to handle devices, FIFOs and sockets;
-Z, --null                print 0 byte after FILE name
-U, --binary              do not strip CR characters at EOL (MSDOS/Windows)


Answer 9:

GNU查找

find /path -type f -name "*.py" -exec md5sum "{}" +;


Answer 10:

从技术上讲,你只需要运行ls -lR *.py | md5sum ls -lR *.py | md5sum 。 除非你是担心有人修改文件,并接触他们回到原来的日期,永不改变文件的大小,从输出ls应该告诉你,如果该文件已经修改。 我的UNIX-foo是弱的,所以你可能需要一些更多的命令行参数,以获得创建时间和修改时间进行打印。 ls也将告诉你,如果对文件的权限已经改变(我敢肯定,有开关把它们关掉,如果你不关心这个)。



Answer 11:

我用HashCopy做到这一点。 它可以生成和验证MD5和SHA上的一个文件或目录。 它可以从www.jdxsoftware.org下载。



Answer 12:

使用md5deep

md5deep -r FOLDER | awk '{print $1}' | sort | md5sum



Answer 13:

我有同样的问题,所以我想出了这个脚本,仅列出文件的MD5SUMS在目录中,如果发现一个子目录从那里再次运行,要做到这一点的脚本必须能够通过电流运行目录或子目录如果说参数传递$ 1

#!/bin/bash

if [ -z "$1" ] ; then

# loop in current dir
ls | while read line; do
  ecriv=`pwd`"/"$line
if [ -f $ecriv ] ; then
    md5sum "$ecriv"
elif [ -d $ecriv ] ; then
    sh myScript "$line" # call this script again
fi

done


else # if a directory is specified in argument $1

ls "$1" | while read line; do
  ecriv=`pwd`"/$1/"$line

if [ -f $ecriv ] ; then
    md5sum "$ecriv"

elif [ -d $ecriv ] ; then
    sh myScript "$line"
fi

done


fi


Answer 14:

如果你想真正从文件系统属性和一些焦油版本的有点水平的差异独立性,你可以使用的cpio:

cpio -i -e theDirname | md5sum


Answer 15:

有两个更多的解决方案:

创建:

du -csxb /path | md5sum > file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum > /tmp/file

校验:

du -csxb /path | md5sum -c file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum -c /tmp/file


Answer 16:

md5sum工作对我很好,但我有问题sort和分类文件名。 所以不是我排序md5sum结果。 我还需要排除以创造可比较的结果的一些文件。

find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum



文章来源: How can I calculate an md5 checksum of a directory?