Linux:模式通配符 * 和globstar **(bash4新增)的使用
相关文章Linux专栏https://blog.csdn.net/weixin_45791458/category_12234591.html在bash的使用过程中模式通配符可以说是最常见、也最实用的一类功能。很多时候我们在命令行里处理文件并不是靠把完整文件名一个个手工敲出来而是通过bash先帮我们把符合规则的文件名展开再把展开后的结果交给命令本身去执行。也就是说ls *.c、rm test*、cp **/*.h ./backup/这类写法本质上并不是ls、rm、cp自己理解了*和**而是shell在命令真正执行之前先完成了一次文件名模式匹配然后把匹配结果替换到命令参数中。因此想要真正理解这类写法关键不只是知道“星号能匹配多个字符”而是要知道shell何时展开、展开成什么、哪些情况下会生效、哪些情况下又不会生效。1、通配符 *在bash的操作环境中还有一个非常有用的功能那就是通配符(wildcard)。我们利用bash处理数据就更方便了 * 是一个常用的模式通配符它能匹配0至无穷个字符。当bash检测到命令行中有 * 时则会自动搜索模式匹配的项目并将其转换成命令行参数的形式传递给命令也就是说使用通配符 * 不会导致命令被多次创建而是一个有很多参数的命令执行一次。如果文件名中有 * 的话你可能不想使用模式通配符 * 的功能此时你可以使用 \ 反斜杠将 * 转义此时 * 只有字面意思或者使用 双引号或 单引号将 * 引用。匹配时当字符串的末尾有 / 时表示只匹配目录如果没有则表示匹配目录和文件如下图所示。在进行文件名拓展时文件名开头的 . 或紧跟在 / 后面的 . 意思就是路径中有隐藏文件时开头的 . 不会被匹配必须被显式地匹配除非你打开了dotglob选项当然如果你使用相对路径时可以不显式说明 ./ 如下图所示。但 . 和 .. 这两个特殊的隐藏目录名即使在打开了dotglob选项后也必须得显式声明 . 如下图所示。* 不是在任何情况下都能匹配0个字符当 * 单独出现时即 * 在路径最后或 * 被路径分隔符 /包围时 * 必须匹配至少一个字符只有当 * 和其他字符在一起时才可能匹配0个字符如下图所示。路径分隔符 / 也必须被显式匹配这就代表着不能跨多级路径进行匹配。2、 globstar **bash4新增了 ** 用于递归的文件匹配 ** 在一定条件下能匹配路径分隔符 / 同时可以解决上面提到的匹配0个字符的限制。在globstar关闭时** 被看做是 * 。globstar使用shopt globstar命令打开同时你要确保bash版本在4以上如下图所示。且这个设置只针对当前bash有效当关闭终端或打开另一个终端后globstar依然是关闭状态。使用 ** 在单独使用的情况下可以匹配 / 分隔符即当 ** 在路径最后或 ** 被路径分隔符 / 包围时。如果 ** 不是单独使用即前后接了字符则 ** 被当作是 *即使globstar打开如下图所示。我们可以注意到 ** 还能匹配0个目录像图中匹配了 ./nihao.txt 和 ./a/ 这两个文件或目录。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2482600.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!