Answers:
Shell文件名的通配符和正则表达式使用一些相同的字符,它们具有相似的用途,但是您是对的,它们不兼容。文件名遍历功能不那么强大。
在文件名中:
*
表示“零个或多个字符”
?
表示“任何单个字符”
但是在正则表达式中,您必须使用.*
“零个或多个字符”来表示,并.
表示“任何单个字符”。A ?
在正则表达式中的含义完全不同:零个或前面RE元素的一个实例。
[]
在我键入此代码的系统上,方括号()似乎在两个系统中均相同,至少在简单情况下如此。这包括POSIX字符类之类的东西(例如[:alpha:]
)。就是说,如果您需要命令在许多不同的系统类型上运行,则建议不要使用除基本功能之外的任何功能,例如字符列表(例如[abeq]
)和字符范围(例如[a-c]
)。
这些差异意味着两个系统仅在简单情况下可以直接互换。如果需要文件名的正则表达式匹配,则需要另一种方法。find -regex
是一种选择。(请注意,find -name
顺便说一句,它也使用glob语法。)
'%'
means '*'
。
回答原始标题中表达的问题:
为什么正则表达式与用于过滤文件的正则表达式不同?
文件名扩展早于大多数操作系统中已经存在的正则表达式(通配符/小丑字符),并且比后者更简单直观。
虽然*.txt
休闲用户很容易理解,但是类似.*\.txt
的东西更适合有经验的用户/程序员,更不用说^.*\.txt$
...
*.txt
不等于.*\.txt
,它(主要)等于,.*\.txt$
因为在.txt
(至少假设合理的文件名遍历之后)之后什么也没有。也许甚至^.*\.txt$
取决于使用情况。证明你的观点?