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