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

Tre*_*rKS 10 bash wildcards

  • * 大致是一个具有无限长度的通配符。
  • ? 大致是长度为一或零的通配符。

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

jim*_*mij 18

不同之处在于 in bash(当您标记问题时)*匹配长度为 0 个或多个字符的任何字符串,而?*匹配至少为 1 个字符的字符串。考虑例如两个文件:file.txtandxfile.txt并尝试使用ls ?*file.txtor列出它们ls *file.txt

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

ls .??*
Run Code Online (Sandbox Code Playgroud)

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


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


Ral*_*edl 7

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

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

如果我们谈论正则表达式,两者都是放在表达式之后的运算符。所以在“?*”中必须放在其他东西之后。