如何用find命令查找32字符长度的MD5哈希命名目录?
查找指定目录下的32字符MD5命名子目录(非递归)
我有一个包含大量子目录的目录,结构如下:
04762b39018e3cf4b1a2c6a304919b75 06e0caf156de30dd962cf6b9300aba66 1f1d0cb1b810336299cda5426d0f12f5 2fe7a428eb303da6846800fa20ab7ed4 41e0136413703b0685d6799f8a22a8e6 asdf 1234 Databases
需求是找出其中名称恰好为32字符长度(MD5哈希值格式)的子目录,且不递归查找。此前尝试的find命令未返回任何结果,希望用find命令(方便后续执行bash操作)或兼容bash的单行命令解决。
问题分析
你之前的命令:
find /root/my/subdir -maxdepth 1 -type d -regex '^.*[a-fA-F0-9]{32}$'
失败原因是-regex匹配的是完整路径而非目录名本身。比如目标目录的完整路径是/root/my/subdir/04762b39018e3cf4b1a2c6a304919b75,整个路径长度远超过32,正则无法匹配。
解决方案
方法1:调整find的-regex匹配规则
让正则匹配路径的最后一段为32位十六进制字符:
find /root/my/subdir -maxdepth 1 -type d -regex '.*/[a-fA-F0-9]{32}$'
.*/匹配路径中目录名之前的所有部分[a-fA-F0-9]{32}$匹配结尾的32位十六进制字符(MD5格式)
方法2:使用find的-name选项(更简洁)
-name仅匹配目录名,无需考虑完整路径,结合字符范围通配符:
find /root/my/subdir -maxdepth 1 -type d -name '[a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]'
虽然写法较长,但能严格匹配32位十六进制字符的目录名。
方法3:bash通配符直接列出(非find方案)
如果不需要find,可以用bash展开直接获取目标目录:
ls -d /root/my/subdir/[a-fA-F0-9]{32} 2>/dev/null
2>/dev/null用于屏蔽无匹配结果时的错误提示
执行上述任一命令后,都会输出预期的5个32字符目录名。
内容的提问来源于stack exchange,提问作者Darwick
相关产品推荐
相关产品推荐

