为什么 glob("*/") 匹配非目录符号链接?

问题描述

我在我的小 C 应用程序中使用 glob(3) 进行通配

/ 结尾的通配符模式应该匹配目录(仅)。 不幸的是,它似乎也匹配任何符号链接(无论它们是指向目录、文件还是根本不指向)。

这是一个小示例程序:

#include <stdio.h>
#include <glob.h>

int main(int argc,char**argv) {
  int flags = GLOB_MARK;
  for(int i=1; i<argc; i++) {
    const char*pattern=argv[i];
    glob_t gg;
    printf("globbing: '%s'\n",pattern);
    if(!glob(pattern,flags,NULL,&gg)) {
      for(int j=0; j<gg.gl_pathc; j++) {
        printf("  %s\n",gg.gl_pathv[j]);
      }
    }
  }
  return 0;
}

这是我的测试数据:

$ ls -l tests/
total 4
drwxr-xr-x 2 user user 4096 Apr 28 10:10 dir
-rw-r--r-- 1 user user    0 Apr 28 10:10 file
lrwxrwxrwx 1 user user    3 Apr 28 10:10 symlink.dir -> dir
lrwxrwxrwx 1 user user    4 Apr 28 10:10 symlink.file -> file
lrwxrwxrwx 1 user user    7 Apr 28 10:10 symlink.Nowhere -> Nowhere

现在,当我用 tests/*/ 通配符时,我本来希望看到 tests/dir/tests/symlink.dir/,但我得到的(在 Debian 上)是这样的:

$ ./glob 'tests/*/'
globbing: 'tests/*/'
  tests/dir/
  tests/symlink.dir/
  tests/symlink.file
  tests/symlink.Nowhere

在 macOS 上,我得到了一些稍微不同的东西(只有指向现有条目的符号链接),这看起来也很奇怪(所有结果都标记为带有尾随 / 的目录,包括指向非目录文件的符号链接):

$ ./glob 'tests/*/'
globbing: 'tests/*/'
  tests/dir/
  tests/symlink.dir/
  tests/symlink.file/

那么:为什么像 tests/*/ 这样的模式会返回 not-only 目录?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)