bash中的文件名扩展


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/05/23/bash%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%89%A9%E5%B1%95/

摘要

本文主要讲述了:

  1. dotglob
  2. /
  3. globstar

正文

在分词之后,bash 会在每个单词中检索*?[。如果出现了这其中的任意一个字符,该单词就会被视为模式,而后进行模式匹配。关于 bash 中的模式匹配请参见bash中的模式匹配bash中的模式匹配扩展

  • 如果模式匹配匹配到了文件名,则该单词被替换为按照字母顺序排列的文件名列表
  • 如果模式匹配没有匹配到文件名,但启用了 shell 的nullglob选项,则删除该单词
  • 如果模式匹配没有匹配到文件名,且禁用了 shell 的nullglob选项,则保留该单词

dotglob

当模式匹配被用于文件名扩展时,除非启用了 shell 的dotglob选项,否则必须显式匹配文件名开头的.

示例:

  • 禁用了 shell 的dotglob选项之后,*不匹配以.开头的所有文件名
  • 禁用了 shell 的dotglob选项之后,?不匹配.

但即使启用了 shell 的dotglob选项之后,...(目录)依旧需要显式匹配。

示例:

  • 启用dotglob选项之后,*匹配以.开头的所有文件名,但*不匹配...(目录)

/

在匹配文件名时,/(路径段分隔符)始终需要显式匹配。

示例:

  • *不能匹配子目录下的文件,只能匹配 CWD 的所有文件和所有子目录
  • */匹配 CWD 的所有子目录
  • */*匹配 CWD 的所有子目录下的所有文件

globstar

当启用了 shell 的globstar选项之后,**递归匹配所有文件、零或更多目录与子目录。**/只能递归匹配零或更多目录与子目录。

1
2
3
#!/usr/bin/env bash

shopt -s globstar

示例:

  • **/*相当于**递归匹配所有文件、零或更多目录与子目录
  • **/*.md递归匹配.md结尾的所有文件、所有以.md结尾的零或更多目录与子目录

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/05/23/bash%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%89%A9%E5%B1%95/


本文对你有帮助?请支持我


支付宝
微信