微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 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 举报,一经查实,本站将立刻删除。