Python Glob模块不能与多重选择一起使用吗?

问题描述 投票:1回答:2

在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语法?

python linux glob
2个回答
0
投票

都不是。 man page for the POSIX function glob(3)不允许两种语法。

**是扩展,由zsh发明并首先普及。 Bash和其他一些人复制了它,并且通常做了一些不兼容的操作。 Bash和Python都复制了它,但是在与其他globlob语法进行交互时选择了稍微不同的行为。

这很有意义:毕竟,尽管glob(3)是POSIX函数,已精确指定并且要完全按照指定的方式实现,但zsh只是一个榜样,可以随意偏离。而且必须偏离,因为zsh has a lot of globbing extensions


0
投票

这是标准的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。所以您不是在比较球形,而是在将带有外壳扩展的球形与仅球形的球形进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.