在Linux中,我的文件夹如下所示:
src
├── app
│ ├── app.component.css
│ ├── app.component.html
│ ├── app.component.spec.ts
│ ├── app.component.ts
│ ├── app.module.ts
│ ├── app-routing.module.ts
│ ├── components
│ │ ├── catalog-main
│ │ │ ├── catalog-main.component.css
│ │ │ ├── catalog-main.component.html
│ │ │ ├── catalog-main.component.spec.ts
│ │ │ └── catalog-main.component.ts
│ │ ├── catalog-sidebar
│ │ │ ├── catalog-sidebar.component.css
│ │ │ ├── catalog-sidebar.component.html
│ │ │ ├── catalog-sidebar.component.spec.ts
│ │ │ └── catalog-sidebar.component.ts
│ │ └── top-bar
│ │ ├── top-bar.component.css
│ │ ├── top-bar.component_handy.css
│ │ ├── top-bar.component_handy.html
│ │ ├── top-bar.component.html
│ │ ├── top-bar.component.spec.ts
│ │ └── top-bar.component.ts
│ ├── icons-provider.module.ts
│ ├── pages
│ │ ├── login
│ │ │ ├── login.component.css
│ │ │ ├── login.component.html
│ │ │ ├── login.component.spec.ts
│ │ │ ├── login.component.ts
│ │ │ ├── login.module.ts
│ │ │ └── login-routing.module.ts
│ │ ├── monitor
│ │ │ ├── monitor.component.css
│ │ │ ├── monitor.component.html
│ │ │ ├── monitor.component.spec.ts
│ │ │ ├── monitor.component.ts
│ │ │ ├── monitor.module.ts
│ │ │ └── monitor-routing.module.ts
│ │ ├── monitor2
│ │ │ └── monitor2.module.ts
│ │ └── welcome
│ │ ├── welcome.component.css
│ │ ├── welcome.component.html
│ │ ├── welcome.component.ts
│ │ ├── welcome.module.ts
│ │ └── welcome-routing.module.ts
│ ├── reducers
│ │ └── index.ts
│ └── store
│ ├── catalog.actions.ts
│ ├── catalog.reducer.ts
│ └── userinfo.ts
├── assets
├── environments
│ ├── environment.prod.ts
│ └── environment.ts
├── favicon.ico
├── index.html
├── main.ts
├── polyfills.ts
├── styles.css
├── test.ts
└── theme.less
我使用此命令输出29个文件:ll src/**/*.ts | wc -l
我使用此命令输出32个文件:ll src/{**,}/*.ts | wc -l
,新文件是src / main.ts,src / test.ts,src / polyfills.ts,它们直接在src文件夹中
但是在python3中,我用glob.glob("src/**/*.ts")
输出所有32个文件,我用glob.glob("src/{**,}/*.ts")
输出所有0个文件
那么,什么是标准的glob语法?
都不是。 man page for the POSIX function glob(3)不允许两种语法。
**是扩展,由zsh发明并首先普及。 Bash和其他一些人复制了它,并且通常做了一些不兼容的操作。 Bash和Python都复制了它,但是在与其他globlob语法进行交互时选择了稍微不同的行为。
这很有意义:毕竟,尽管glob(3)是POSIX函数,已精确指定并且要完全按照指定的方式实现,但zsh只是一个榜样,可以随意偏离。而且必须偏离,因为zsh has a lot of globbing extensions。
这是标准的glob语法?
因为您标记了linux
,所以我假设您使用了bash
。 Bash具有nostandard(即不在posix中)扩展名,与扩展brace expansion不相关。
The:
ll src/{**,}/*.ts | wc -l
首先扩展为:
ll src/**/*.ts src/*.ts | wc -l
在进行括号扩展时按bash键。然后next发生全局扩展。在解析glob参数时,Python不会进行任何外壳扩展,因此python会搜索名称为{
并以字面意义作为字符的,
和}
结尾的文件/目录-因为找不到,所以计数为0。所以您不是在比较球形,而是在将带有外壳扩展的球形与仅球形的球形进行比较。