用 grep 列出文件?

用 grep 列出文件?

我有一个包含以下文件的目录:

file1a file1ab file12A2 file1Ab file1ab

我想要列出所有以file1最多两个字母开头且后面跟着两个字母的文件!

我提出的解决方案如下:

ls | grep -i file1 [az] {2}

但它不起作用!

我想知道为什么?以及如何列出?

答案1

你不需要管道,grep或者ls。只需使用 shell 通配符即可。

在 中bash,使用extglob模式(在交互式会话中应该默认启用,如果没有,请先shopt -s extglob设置它):

file1@(|?|??)

?匹配任意单个字符,@(||)选择以 分隔的任意模式|

如果您只想匹配a-z和之间的任何字符A-Z,请使用[:alpha:]表示当前语言环境中所有字母字符的字符类:

file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

例子:

$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb

$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as

zsh本机支持此功能:

file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

应 OP 的要求,我很不情愿地回答这部分。

任何未来的读者,不要解析ls,而使用通配符。

使用lsgrep

ls | grep -E '^file1[[:alpha:]]{,2}$'

例子:

% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as

答案2

找到什么了?

find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'

答案3

find-regex标志更适合这种工作,特别是因为一般来说ls 的输出永远不应该被解析

但是,您已经声明您只在一个目录中寻找文件(不下降到子目录中),并且您特别想要lsgrep。解决方案是

\ls | grep -E 'file1[a-z]{2,}' 

还考虑到您正在当前目录中搜索,但避免解析ls,这里是另一种解决方案

 for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

在我当前的目录中,我有两个文件,file1abfile1abc。在这两种情况下,结果如下:

xieerqi:$ for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

xieerqi:$ \ls | grep -E 'file1[a-z]{2,}'                                                                            
file1ab
file1abc

相关内容