Bash 中 * 和 ?* glob 之间的区别

Bash 中 * 和 ?* glob 之间的区别
  • *大致是一个长度无限的通配符。
  • ?大致是一个或零长度的通配符。

在 中搜索字符串时使用*vs之间有区别吗??*bash

答案1

区别在于,in bash(如您标记问题一样)*匹配长度为零或多个字符的任何字符串,而?*匹配长度至少为 1 个字符的字符串。例如,考虑两个文件:file.txtxfile.txt并尝试用ls ?*file.txt或列出它们ls *file.txt

当我使用这种构造时,一个真实的案例是列出隐藏文件。很多时候我只是这样做

ls .??*

这里使用双问号是为了防止列出当前目录.和父目录..,就像更简单的形式一样ls .*


我需要在这里指出我的.??*并不完美;例如,只有两个字符的文件名(如.f)与此模式不匹配。更可靠的解决方案是ls {..?,.[!.]}*,但通常这对我来说打字太多了。

答案2

你从哪里得到这个定义,你指的是哪种表达方式?

如果我们谈论 shell 表达式,这两个字符都可以单独使用,但是 for 的定义?不匹配,因为它总是匹配一个字符,而不是 1 或 0。

如果我们谈论正则表达式,两者都是放置在表达式之后的运算符。因此“?*”中必须放在其他内容之后。

相关内容