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

为何glob启用recursive=True时重复10次匹配同一文件?

为什么多**加recursive=True会重复匹配同一文件

当你使用glob.glob("/home/result/test/**/**/**/*.xml", recursive=True)时,同一文件被匹配10次的核心原因是多个**在递归模式下的匹配逻辑叠加:

  1. 递归模式下的**规则
    在recursive=True时,**代表匹配任意层级的目录(包括0层空路径)。也就是说每个**既可以匹配空,也可以匹配1级、2级甚至更多级目录。

  2. 组合匹配的次数计算
    目标文件的路径是/home/result/test/foo/bar/test_results/testsystems.xml,从test/到testsystems.xml之间有3级子目录(foo/、bar/、test_results/)。
    你写的三个**需要共同“分配”这3级目录的匹配任务,允许某个**匹配0层。这本质是数学里的可重复组合问题,计算公式为C(n+k-1, k-1):

    • n是需要匹配的目录层级数(3)
    • k是**的数量(3)
      代入得C(3+3-1, 3-1) = C(5,2) = 10,刚好对应你看到的10次重复。
  3. 直观的匹配组合示例
    三个**的匹配方式包括但不限于:

    • 第一个**匹配foo/bar/test_results/,后两个**匹配空路径
    • 第一个**匹配foo/,第二个匹配bar/test_results/,第三个匹配空
    • 第一个**匹配foo/,第二个匹配bar/,第三个匹配test_results/
      所有10种组合最终都会指向同一个文件路径,所以glob会返回10次相同结果。
正确写法的逻辑
  • 递归模式下,单个**就足够匹配任意层级的子目录,所以glob.glob("/home/result/test/**/*.xml", recursive=True)只会匹配每个文件一次。
  • 如果不设置recursive=True,**会被当作普通的单级目录匹配符(等价于*),此时/home/result/test/**/**/**/*.xml只会匹配test下第4级目录中的xml文件,不会出现重复匹配。

内容的提问来源于stack exchange,提问作者Sir l33tname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:42:40