我需要计算汇总MD5校验特定类型(所有文件*.py
一个目录及其所有子目录下放置的例子)。
什么是做到这一点的最好方法是什么?
编辑:提出的解决方案是非常好的,但是这不正是我需要的。 我正在寻找一个解决方案,以得到一个简要的校验和,这将唯一地标识目录作为一个整体-包括它的所有子目录的内容。
我需要计算汇总MD5校验特定类型(所有文件*.py
一个目录及其所有子目录下放置的例子)。
什么是做到这一点的最好方法是什么?
编辑:提出的解决方案是非常好的,但是这不正是我需要的。 我正在寻找一个解决方案,以得到一个简要的校验和,这将唯一地标识目录作为一个整体-包括它的所有子目录的内容。
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 -
即时创建和管道,为tar归档文件md5sum
:
tar c dir | md5sum
这将产生一个单一的md5sum应该是唯一的,您的文件和子目录设置。 没有文件在磁盘上创建。
ire_and_curses的使用建议, tar c <dir>
有一些问题:
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
是确保跨系统可靠排序顺序 -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
幸运的是,我有一个在他们的名字换行没有文件/目录,所以这不是系统的问题。
如果你只关心文件,而不是空目录,这很好地工作:
find /path -type f | sort -u | xargs cat | md5sum
为了完整性的缘故,有md5deep(1) ; 它不能直接适用,由于*的.py过滤器的要求,但应与find(1)做精在一起。
一个解决方案,它的工作最适合我:
find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum
之所以它的工作最适合我:
与其他答案的问题:
文件系统元数据是不是忽略:
tar c - "$path" | md5sum
不处理包含空格的文件名,也没有检测,如果文件被重命名:
find /path -type f | sort -u | xargs cat | md5sum
如果你想要一个跨越的md5sum整个目录,我会做类似
cat *.py | md5sum
校验所有文件,包括内容和它们的文件名
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)
GNU查找
find /path -type f -name "*.py" -exec md5sum "{}" +;
从技术上讲,你只需要运行ls -lR *.py | md5sum
ls -lR *.py | md5sum
。 除非你是担心有人修改文件,并接触他们回到原来的日期,永不改变文件的大小,从输出ls
应该告诉你,如果该文件已经修改。 我的UNIX-foo是弱的,所以你可能需要一些更多的命令行参数,以获得创建时间和修改时间进行打印。 ls
也将告诉你,如果对文件的权限已经改变(我敢肯定,有开关把它们关掉,如果你不关心这个)。
我用HashCopy做到这一点。 它可以生成和验证MD5和SHA上的一个文件或目录。 它可以从www.jdxsoftware.org下载。
使用md5deep
:
md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
我有同样的问题,所以我想出了这个脚本,仅列出文件的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
如果你想真正从文件系统属性和一些焦油版本的有点水平的差异独立性,你可以使用的cpio:
cpio -i -e theDirname | md5sum
有两个更多的解决方案:
创建:
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
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