2017-06-14 51 views
1

使用egrep的,正则表达式 “^ {8} $” 正好8个字符的任意文件名匹配:发现-regex不承认有什么似乎是一个很好的查询

[email protected]:~/smsn+/kb/vcs/private$ ls | egrep "^.{8}$" 
ac7t6-Xo 
aQsqsC4- 
a_wzemGk 
[email protected]:~/smsn+/kb/vcs/private$ 

但是使用find,我是否使用POSIX扩展或普通的那种,这种模式行不通:

[email protected]:~/smsn+/kb/vcs/private$ find . -regex "^.{8}$" 
[email protected]:~/smsn+/kb/vcs/private$ find . -regextype posix-extended -regex "^.{8}$" 
[email protected]:~/smsn+/kb/vcs/private$ 

其实我尝试了所有的其他regextypes - emacs的,POSIX的基础,POSIX的AWK,POSIX,egrep的 - 作为上市here

+1

为什么不'LS ????????'? – Barmar

+0

我不知道'ls'支持的通配符。谢谢! –

+1

通配符由shell扩展,因此每条命令都会自动支持它们。 – Barmar

回答

2

这是行不通的,因为find输出也将包括./每个文件名之前,因为你的路径参数是.

您可以使用:

find . -regextype posix-extended -regex "^[^/]{10}$" 

要不然:

find . -regextype posix-extended -regex "^\./[^/]{8}$" 

使用[^/]而不是.确保我们不匹配子目录中的文件名ectories。

或者,我们可以使用-maxdepth 1以及避免子目录匹配:

find . -maxdepth 1 -regextype posix-extended -regex "^\./.{8}" 
+0

请注意,如果组合长度为8,则这将匹配子目录中的文件名。 '。/ foo/1234' – Barmar

+0

是的,因为'.'与'/'匹配。 OP可以使用:'[^ /] {8}'而不是'。{8}' – anubhava

相关问题