有人知道最左列中的 Unixfind
搜索 -name 查询与Wikipedia_?
上定义的 Kleene Star 有何关系吗?如何使用完成行?_?
find
. : empty string, X : cartesian product
-name \A\B Language A X B
-name \ABC Language A X B X C
-name : name at leafs, builds set of string in language
-name \. V^0 {e, ""} language only of the empty string A with only one leg?
-name \? V^1 V language of single characters
-name \???... V^n language of n character strings, concatenates strings in language
-name \* V^* langauge of \cup_{i\gte0} V^i
a? -name \n V^n like \{n\} in grep with integer?
b? -name \*n (V^*)^n language of n words, word can be empty
-name \*\??... (V^*)^n
-name \?\* V^+ langauge of \cup_{i\gte1} V^i
-name \?\*\??... (V^+)^n language of n words, word must have character
看起来是只有一条腿且长度定义的 .
图。使用,但是我似乎找不到与 等效的。A
grep
\{n\}
a?
find
find
传递给-name
和-path
(在某些实现中也是-iname
和)的模式与用于文件名生成(又名路径名扩展,又名shell 中的通配符)的模式相同,并且源自第一个 Unix shell 在 70 年代早期调用的执行该过程的辅助程序。-ipath
find
/etc/glob
现在通常的
find
实现使用80 年代后期引入的标准fnmatch()
函数glob()
以及 ,wordexp()
以便能够将这种 shell 扩展运算符带入除 shell 之外的软件中。在标准 shell 全局变量中,
?
匹配任何单个字符,相当于 regexp.
,并且*
匹配任何字符序列,相当于 regexp.*
并且[set]
匹配给定集合中的任何单个字符或排序元素,与 regex 相同,[set]
只是集合否定是用!
而不是^
,就是这样。因此,虽然 regexp
*
对应于 Kleen 星号,但fnmatch()
's*
不对应。它是将 Kleen 星号应用于?
(单个字符)。Ksh88 引入了许多扩展的通配符,使它们与正则表达式之间具有奇偶校验:
@(...)
相当于扩展正则表达式(...)
?(...)
相当于扩展正则表达式(...)?
*(...)
相当于扩展的正则表达式(...)*
,所以相当于Kleen星号。+(...)
相当于扩展的正则表达式(...)+
。!(...)
没有标准的 ERE 等效项。|
在其中用于交替。ksh93 又添加了一些:
{x,y}(...)
相当于 ERE(...){x,y}
。&
在 for 中使用且没有标准 ERE 等效项。~(flags:...)
包括~(E:...)
真正将 ERE 视为现实。zsh 还添加了与 ERE 具有奇偶校验的运算符,其语法不同(通常比 ksh 更简洁),例如:
#
相当于ERE*
(克莱恩星)##
相当于 ERE+
(...)
相当于 ERE(...)
(与|
ERE 类似,在内部进行交替处理)(#cy,y)
相当于 ERE{x,y}
。但是这些 ksh 或 zsh 操作符都没有达到该
sh
语言的标准规范(尽管标准sh
语言主要基于 ksh88 语言的一个子集),也没有达到(如's /fnmatch()
所使用的)。find
-name
-path
但是,的 GNU 和 uClibc 实现
fnmatch()
确实支持一个标志,通过该标志可以识别FNM_EXTMATCH
ksh88 扩展的通配符(包括),但据我所知,没有实现使用该标志进行/匹配。这样做会使它们不符合 POSIX 标准,因为匹配名称以 结尾的文件(而不是名称由任意数量的s 组成的文件)是必需的。*(...)
find
-name
-path
-name '*(foo)'
(foo)
foo
但是,有些
find
实现有一个-regex
运算符,其工作原理类似于-path
,只不过它采用隐式锚定正则表达式而不是 shell 全局变量。find
不过,默认正则表达式风格和在正则表达式风格之间切换的语法因实现而异(例如,-E
在 BSD 中,您需要一个选项find
来切换到标准扩展正则表达式,而-regextype posix-extended
在 GNU 中则需要一个谓词find
)。对于名称由任意数量的
foo
s 组成的文件,您可以执行以下操作:这些
*
s 对应于克莱恩星。如果你问如何
_
在-name
(fnmatch()
) 模式中匹配 0 次或 1 次出现,答案是“你不能”。没有与 等效的
find -E . -regex '.*/foo_?bar'
(BSD 语法)等效的-name
,但您始终可以执行以下操作:或者使用
zsh
的递归通配符:或者在 ksh93 中(它可以
globstar
识别 zsh 的**/
递归 glob 运算符):或者
bash
5.0+ (可以extglob
识别 ksh88 操作符,并且可以进行globstar
zsh
递归**/
通配):或者使用
perl
具有高级正则表达式和File::Find
模块:还有一个
File::FnMatch
perl 模块,FNM_EXTMATCH
如果系统fnmatch()
有的话您可以使用它: