ls与文件名不匹配(除非你想考虑GNU扩展名,如–include / – exclude).这是通常用于它的shell globs.
ls -ld [[:alpha:]][[:alpha:]]*e*[[:alpha:]]
会找到符合这些要求的文件,但会错过ee.你可以这样做:
zsh的
使用AND NOT / EXCEPT运算符(?)和NOT(^):
setopt extendedglob
ls -ld [[:alpha:]](#c2)*~^*e*~^*[[:alpha:]]
或者使用类似perl的预览正则表达式运算符:
setopt rematchpcre
match() [[ $REPLY =~ '^(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]]' ]]
ls -ld *(+match)
ksh93的
使用&里面@(…):
ls -ld @([[:alpha:]][[:alpha:]]*&*e*&*[[:alpha:]])
与其增强的正则表达式相同(使用?(X:…)启用):
ls -ld ~(X:[[:alpha:]][[:alpha:]].*&.*e.*&.*[[:alpha:]])
或者使用类似perl的前瞻操作符:
ls -ld ~(P:(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]])*
庆典
bash没有AND运算符,但在启用extglob选项时它确实支持ksh运算符的子集,因此您可以执行以下操作:
shopt -s extglob
ls -ld @([[:alpha:]]?([[:alpha:]]*)e?(*[[:alpha:]])|e[[:alpha:]]?(*[[:alpha:]]))
@(x | y)(如zsh(x | y))是OR运算符. ?(x)是一个可选的x(如zsh(x |); @(x |)也适用于ksh / bash).
另一个技巧是使用“A和B”是“不(不是(A)或不是(B))”的事实,而bash支持的ksh globs的子集恰好包含一个not和or运算符,所以你可以做:
ls -ld !(!([[:alpha:]][[:alpha:]]*)|!(*e*)|!(*[[:alpha:]]))
那些运算符也适用于ksh(所有变体,没有shopt),这些运算符首先来自.
非基于全局的方法
找到:
find . ! -name . -prune -name '[[:alpha:]][[:alpha:]]*' \n -name '*e*' \n -name '*[[:alpha:]]' -exec ls -ld {} +
(请注意文件列表不会被排序,并且将排除包含不构成有效字符的字节的文件名;文件名也将以./为前缀).