当前位置: 首页 > ds >正文

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

在文件路径匹配中,** 是一种特殊的通配符(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 等),我可以给出针对性示例!

http://www.xdnf.cn/news/761.html

相关文章:

  • 【CentOs】构建云服务器部署环境
  • 基数平衡多伯努利滤波器(CB-MBM):基于约束优化的多目标数量与存在概率联合估计方法
  • 在Fortran和Python之间共享变量
  • 一个Nuxt3 SSR服务端渲染简洁好用的开源个人博客系统 交互设计体验简单 腾讯markdown编辑器 支持drawio画图
  • STM32开发过程中碰到的问题总结 - 4
  • [Windows] 星光桌面精灵 V0.5
  • OSI七层模型
  • 开源项目FastAPI-MCP:一键API转换MCP服务
  • 信创时代编程开发语言选择指南:国产替代背景下的技术路径与实践建议
  • MIT6.S081-lab4前置
  • ROS机器人开发实践->机器人建模与仿真
  • LeetCode每日一题4.20
  • SSRF学习
  • 【Agent】AI智能体评测基座AgentCLUE-General
  • 21.Chromium指纹浏览器开发教程之触摸屏点指纹定制
  • RHCSA Linux 系统文件内容显示2
  • 云梦数字化系统 介绍
  • 2025 第十六届蓝桥杯Java B组
  • 信号的概念
  • 《软件设计师》复习笔记(2.4)——输入输出、中断、总线、可靠性
  • TensorFlow介绍
  • 漫游git rebase + 浅谈git checkout和git branch -f的分支命令
  • Linux内核哈希表学习笔记
  • Vue3 + TypeScript + Pinia 搭建一套企业级的开发脚手架
  • 数字化时代下的工业物联网智能体开发平台策略
  • Vue3中provide和inject数据修改规则
  • 代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
  • C++——智能指针
  • 防抖与节流的理解与应用
  • 【C++】win 10 / win 11:Dev-C++ 下载与安装