是否可以使用bash使用简单的ls命令实现以下功能.
列出以两个字母开头的所有文件,名称中包含e,以1个或多个字母结尾.
如果是这样,命令是什么,并且需要启用扩展的globbing吗?
解决方法:
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:]]*' \
-name '*e*' \
-name '*[[:alpha:]]' -exec ls -ld {} +
(请注意文件列表不会被排序,并且将排除包含不构成有效字符的字节的文件名;文件名也将以./为前缀).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。