脚本中**通配符用法解析

在文件路径匹配中,** 是一种特殊的通配符(Glob Pattern),主要用于表示递归匹配任意层级的子目录。这种语法常见于以下场景:


1. 典型应用场景

  • .gitignore 文件
    **/__pycache__ 表示匹配项目根目录下所有层级的 __pycache__ 文件夹(包括直接位于根目录的情况)
  • 构建工具/脚本
    webpackgulprsync 等工具支持 ** 语法
  • Shell 脚本(需开启 globstar 选项):
    shopt -s globstar  # 启用 ** 递归匹配
    ls **/__pycache__  # 列出所有层级的 __pycache__ 目录
    

2. 与正则表达式的区别

  • 正则表达式
    * 表示前一个字符的零次或多次重复(如 a* 匹配 a, aa, aaa),** 在正则中没有特殊含义
  • 通配符
    * 匹配任意字符(不含路径分隔符),** 专门用于跨目录层级匹配

3. 具体行为示例

模式匹配示例不匹配示例
__pycache__仅当前目录下的 __pycache__src/__pycache__
*/__pycache__直接子目录中的 __pycache__根目录或更深层目录
**/__pycache__任意层级的 __pycache__

4. 常见工具支持情况

工具/场景是否支持 **备注
.gitignore✅ 是默认生效
Bash/Zsh Shell✅ 是 (需开启 globstar)默认关闭,需 shopt -s globstar
Python glob❌ 否需用 ** + recursive=True
Regular Expressions❌ 否** 无特殊含义

总结:**/__pycache__ 中的 **通配符而非正则表达式,专门用于递归匹配多级目录,是管理编译产物(如 Python 的 __pycache__)的常见写法。


你的问题非常关键!在路径匹配中,** 递归的起始位置取决于你写路径的上下文。在 Ubuntu(或其他系统)中具体表现如下:


一、核心规则

  • 若路径以 / 开头
    从系统根目录开始匹配(例如 /home/**/__pycache__ 会递归整个系统)
  • 若路径是相对路径
    从当前工作目录开始递归(例如 **/__pycache__src/**/__pycache__

二、典型场景分析(Ubuntu 22.04 实测)

1. .gitignore 文件
  • 规则:路径始终相对于 项目根目录(即 .git 所在目录)
  • 示例
    **/__pycache__      # 匹配项目内所有层级的 __pycache__ 目录
    /docs/**/*.log      # 从项目根目录的 docs 目录开始递归
    
2. Shell 命令行(Bash/Zsh)
  • 相对路径
    # 假设当前目录是 /home/user/project
    ls **/__pycache__   # 递归匹配 /home/user/project 下的所有 __pycache__
    
  • 绝对路径
    ls /**/__pycache__  # 递归整个系统(危险操作!可能遍历大量文件)
    
3. find 命令对比
# 等效于 **/__pycache__ 的相对路径行为
find . -name "__pycache__" -type d

# 等效于 /**/__pycache__ 的绝对路径行为
find / -name "__pycache__" -type d  # 慎用!

三、路径起始点验证实验

假设你的目录结构如下:

/home/user/project/
├── src/
│   └── utils/
│       └── __pycache__
└── __pycache__
测试 1:在 /home/user/project 目录下执行
shopt -s globstar  # 启用 **
echo **/__pycache__
# 输出:__pycache__ src/utils/__pycache__
测试 2:在 /home/user 目录下执行
cd /home/user
echo project/**/__pycache__
# 输出:project/__pycache__ project/src/utils/__pycache__

四、安全提示

  • 避免意外递归系统根目录
    绝对路径形式的 /**/.../*/... 可能触发全盘扫描,导致性能问题或误删文件。
  • 显式限定范围更安全
    优先使用相对路径(如 ./**/__pycache__)或明确父目录(如 src/**/__pycache__)。

五、工具差异总结

场景起始路径示例
.gitignore项目根目录**/__pycache__
Shell 相对路径当前工作目录./**/__pycache__
Shell 绝对路径系统根目录 //**/__pycache__
Python pathlib取决于 Path() 起点Path(".").glob("**/*")

如果仍有疑问,可以告诉我你的具体使用场景(如命令行、脚本、.gitignore 等),我可以给出针对性示例!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值