配置mkid的id-lang.map无法排除文件,如何创建正确的GNU id数据库?
GNU idutils:排除生成文件失败的问题排查
我正在使用mkid创建GNU id数据库,源码目录中有编译时生成的.c文件,希望创建数据库时忽略这些文件,于是在~/.id-lang.map中添加了配置,但规则未生效,使用gid时仍会出现重复搜索的情况。
我的~/.id-lang.map配置如下:
# 默认语言 ** IGNORE # 排除生成的.c文件 */gen/* IGNORE # --> 尝试排除部分文件,但未生效? # 先列出头文件,再列出代码文件 *.h C *.h.in C *.H C++ *.hh C++ *.hpp C++ *.hxx C++ # 头文件之后列出C代码文件 *.c C *.C C++ *.cc C++ *.cpp C++ *.cxx C++
执行的mkid命令:
mkid --lang-map=$HOME/.id-lang.map
问题原因及解决建议
- 配置顺序错误(核心问题)
GNU idutils的语言映射规则是从上到下匹配,第一个命中的规则生效。你把** IGNORE放在最顶部,这会匹配所有文件,导致后面的*/gen/*、*.c等规则完全不会被触发。
正确的配置顺序应该是:
- 先写需要排除的规则(比如
*/gen/* IGNORE) - 再写需要纳入数据库的文件规则(各种
.h、.c后缀的映射) - 最后写
** IGNORE作为默认规则,忽略其他未匹配的文件
调整后的配置示例:
# 排除生成的.c文件 **/gen/** IGNORE # 匹配任意层级下gen目录中的所有文件 # 先列出头文件,再列出代码文件 *.h C *.h.in C *.H C++ *.hh C++ *.hpp C++ *.hxx C++ # 头文件之后列出C代码文件 *.c C *.C C++ *.cc C++ *.cpp C++ *.cxx C++ # 默认忽略其他所有文件 ** IGNORE
路径匹配规则优化
原规则*/gen/*仅匹配“一级目录下的gen目录中的文件”(比如src/gen/foo.c),但无法匹配根目录下的gen/foo.c。改用**/gen/**可以匹配任意层级目录下的gen目录及其子文件/目录,覆盖范围更全面。直接使用
mkid排除选项
如果不想修改语言映射文件,可以直接用mkid的--exclude参数排除目标目录,命令示例:
mkid --exclude='**/gen/**'
- 验证规则生效情况
使用mkid --debug命令运行,会输出每个文件的匹配规则详情,你可以检查生成文件是否被正确标记为IGNORE,以此确认配置是否生效。
内容的提问来源于stack exchange,提问作者Mithun B
相关产品推荐
相关产品推荐

