我有一个包含以下文件的目录:
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
,而使用通配符。
使用ls
和grep
:
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 的输出永远不应该被解析。
但是,您已经声明您只在一个目录中寻找文件(不下降到子目录中),并且您特别想要ls
和grep
。解决方案是
\ls | grep -E 'file1[a-z]{2,}'
还考虑到您正在当前目录中搜索,但避免解析ls
,这里是另一种解决方案
for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done
./file1ab
./file1abc
在我当前的目录中,我有两个文件,file1ab
和file1abc
。在这两种情况下,结果如下:
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