BASH实现递归计算MD5值(不使用md5deep工具)
几种不用md5deep递归计算/bin目录文件MD5值的方法
嘿,这个问题我日常运维里碰到过好多次,除了md5deep,其实用系统原生的工具组合就能搞定,不用额外安装软件,给你分享几个实用的方案:
1. 用find命令(最通用、兼容性最好)
这是最稳妥的原生方案,几乎所有类Unix系统都支持:
find /bin -type f -exec md5sum {} +
-type f:只筛选普通文件,跳过目录、符号链接这些(如果需要包含符号链接指向的文件,可以去掉这个参数,或者用-type f -o -type l再配合-exec readlink -f {} \;,不过/bin里的软链接大多指向其他命令,按需选择)-exec md5sum {} +:把找到的所有文件批量传给md5sum,比用;逐个传递效率高很多
如果要处理带特殊字符的文件名(虽然/bin里基本不会有,但养成好习惯),可以加-print0和-0避免解析错误:
find /bin -type f -print0 | xargs -0 md5sum
2. Bash 4+的globstar特性
如果你用的是Bash 4.0及以上版本,可以开启递归匹配的glob功能,用更简洁的命令实现需求:
# 先开启globstar选项 shopt -s globstar # 递归匹配/bin下所有文件 md5sum /bin/**
要是想只处理普通文件,避免目录和软链接,可以加个简单的循环过滤:
shopt -s globstar for file in /bin/**; do if [ -f "$file" ]; then md5sum "$file" fi done
需要关闭globstar的话,执行shopt -u globstar即可。
3. 为什么不推荐用ls -la的方法?
你之前想的通过ls输出遍历的思路确实存在明显问题:ls的输出是给人阅读设计的,不是给脚本解析的——如果文件名里有空格、换行符或者特殊字符,脚本很容易解析出错,而且还要额外写代码处理输出,效率和稳定性都远不如上面的方案,完全没必要用。
总结
- 追求兼容性和稳定性:优先用
find的方案,几乎适配所有类Unix环境 - 用Bash 4+且喜欢简洁命令:试试
globstar特性 - 要是经常需要这类哈希递归计算,md5deep确实是最省心的第三方工具,不过原生方案足够应付大部分场景了
内容的提问来源于stack exchange,提问作者Rookie
相关产品推荐
相关产品推荐

