了解 glob 模式匹配

了解 glob 模式匹配 ByAI

5月 18, 2024
ByAI, Tools, Linux

在 Visual Studio Code(VSCode)以及许多其他工具和库中,文件路径匹配通常使用 glob 模式

Glob 模式中的通配符 #

  • *:匹配任意数量的字符(不包括路径分隔符 /)。
  • **:匹配任意数量的目录层级,包括子目录。
  • ?:匹配单个字符。
  • [abc]:匹配方括号内的任意一个字符。
  • {a,b}:匹配花括号内的任意一个模式。
WildcardDescriptionExampleMatchesDoes not match
*matches any number of any characters including noneLaw*LawLaws, or LawyerGrokLawLa, or aw
*Law*LawGrokLaw, or Lawyer.La, or aw
?matches any single character?atCatcatBat or batat
[abc]matches one character given in the bracket[CB]atCat or Batcatbat or CBat
[a-z]matches one character from the (locale-dependent) range given in the bracketLetter[0-9]Letter0Letter1Letter2 up to Letter9LettersLetter or Letter10

示例解释 #

  1. **/*.log

    • **:匹配任意数量的目录层级。
    • *.log:匹配所有以 .log 结尾的文件。

    这个模式将匹配项目目录中的所有 .log 文件,无论它们位于哪个子目录中。

  2. node_modules

    • 这个模式将直接匹配项目根目录下的 node_modules 文件夹。
  3. **/dist/**

    • 第一个 **:匹配任意数量的目录层级。
    • dist:匹配名称为 dist 的文件夹。
    • 第二个 **:匹配 dist 文件夹中的任意数量的目录层级和文件。

    这个模式将匹配项目目录中任意位置的 dist 文件夹及其所有子目录和文件。

具体示例 #

假设你的项目目录结构如下:

my-project/
├── src/
│   ├── index.js
│   └── utils.js
├── logs/
│   ├── app.log
│   └── error.log
├── node_modules/
│   └── ...
├── dist/
│   ├── bundle.js
│   └── assets/
│       └── image.png
└── README.md
  • **/*.log 将匹配 logs/app.loglogs/error.log
  • node_modules 将匹配 node_modules/ 文件夹。
  • **/dist/** 将匹配 dist/ 文件夹及其所有内容,包括 dist/bundle.jsdist/assets/image.png

在 .gitignore 中使用 glob #

没错在 .gitignore 也同样遵循 glob 模式匹配。

基本的 Glob 模式 #

  1. *:匹配零个或多个字符,但不匹配路径分隔符(/)。
    • 示例:*.log 匹配所有以 .log 结尾的文件,如 error.logaccess.log
  2. ?:匹配单个字符。
    • 示例:file?.txt 匹配 file1.txtfileA.txt,但不匹配 file12.txt
  3. [...]:匹配方括号内的任意一个字符。
    • 示例:file[0-9].txt 匹配 file0.txt 到 file9.txt
  4. **:匹配零个或多个目录及其子目录。
    • 示例:src/** 匹配 src/ 目录及其所有子目录和文件。

特殊模式 #

  1. /:用于分隔目录路径。
    • 示例:/build/ 匹配根目录下的 build 目录,但不匹配 subdir/build/
  2. !:用于否定模式,表示不忽略匹配的文件或目录。
    • 示例:!important.log 表示即使其他规则忽略了 .log 文件,也不忽略 important.log
  3. #:用于注释行。
    • 示例:# 这是一个注释
  4. /:用于指示从项目的根目录开始匹配。
    • 示例:/foo 只匹配项目根目录下的 foo 文件或目录。

Glob 和正则匹配不一样吗? #

Glob 模式和正则表达式都是用于模式匹配的工具,但它们有不同的语法和应用场景。Glob 主要用于文件名匹配,而正则表达式则更为通用,适用于字符串匹配。两者各有优缺点,选择使用哪种模式取决于具体需求。

总结 #

  • glob 模式和正则表达式的区别
    • glob 模式主要用于文件名匹配,使用简单的通配符如 *?
    • 正则表达式用于更复杂的字符串匹配,具有更强的表达能力和灵活性。
  • 应用场景
    • glob 模式常用于文件系统操作,如查找特定类型的文件。
    • 正则表达式广泛应用于文本处理、数据验证和搜索替换等。
  • 优缺点
    • glob 模式简单易用,但功能有限。
    • 正则表达式功能强大,但语法复杂,学习曲线较陡。
本文共 1306 字,上次修改于 Oct 14, 2024,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

相关文章

» 使用 EditorConfig 和 Prettier 来规范代码风格

» tar 命令中的绝对路径和相对路径使用注意

» 理解 useMemo、useCallback 和 memo

» CSS 中的 inherit 选项

» I/O 多路复用机制