You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

问题原因及解决建议

  1. 配置顺序错误(核心问题)
    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
  1. 路径匹配规则优化
    原规则*/gen/*仅匹配“一级目录下的gen目录中的文件”(比如src/gen/foo.c),但无法匹配根目录下的gen/foo.c。改用**/gen/**可以匹配任意层级目录下的gen目录及其子文件/目录,覆盖范围更全面。

  2. 直接使用mkid排除选项
    如果不想修改语言映射文件,可以直接用mkid的--exclude参数排除目标目录,命令示例:

mkid --exclude='**/gen/**'
  1. 验证规则生效情况
    使用mkid --debug命令运行,会输出每个文件的匹配规则详情,你可以检查生成文件是否被正确标记为IGNORE,以此确认配置是否生效。

内容的提问来源于stack exchange,提问作者Mithun B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:53:13