2016-09-18 87 views
0

我有一个任务,我必须找到具有我认为需要正则表达式的条件的不同文件。在Ubuntu中使用正则表达式查找文件

例如:

查找以3个小写字母开始,并在最后一个字母是不是一个“我”的文件。我正在寻找找到这些文件的最佳方式。

我能做

ls [a-z][a-z][a-z]*[azertyuopqsdfghjklmwxcvbn] 

而且是啊,这似乎有点的。 任何想法?

+1

你的“不是我”的范围可以是'[a-hj-z]',对不对?祝你好运。 – shellter

+0

,你会怎么说“没有元音”? [b-df-hj-np-tv-xz] – Couteau

+0

这是一种方式,但是对于char类有一个否定运算符,所以你可以做'[^ aeiou0-9 :: punct ::]'(如果你真的只是想要小写字母)。实际上['bd ...]'并不坏,因为它明确列出了你希望匹配的内容,而且你不必猜测你使用':: punct ::'和其他一些“捷径”术语。还有其他':: named-ranges ::',但我不想尝试找到你的参考;-)(我正在从操作中恢复)。祝你好运。 – shellter

回答

4
$ ls 
abci ASds dferasfds dsfa998 ilkj323 retk232i 

$ find -regextype egrep -regex '.*/[a-z]{3}.*[^i]$' 
./dferasfds 
./dsfa998 
./ilkj323 
  • .*/需要相匹配的文件路径的开头部分
  • [a-z]{3} 3小写字母
  • .*任何其他字符
  • [^i]$i

然而结束,这特殊的情况似乎poss没有正则表达式的ible:

$ find -name '[a-z][a-z][a-z]*[!i]' 
./dferasfds 
./dsfa998 
./ilkj323 
3

这些是globs,而不是正则表达式。你不需要正则表达式。

printf '%s\n' [a-z][a-z][a-z]*[!i] [a-z][a-z][a-hj-z] 

第二种模式覆盖三个字符长的文件名;根据您的要求不清楚这些是否应该包括在内。 (如果没有匹配的文件存在,shell会发出警告消息,但这是无害的。)如果没有,只需使用第一种模式。

(我使用printf主要说明的是,外壳在这里所做的实际工作,ls没有必要扩大glob模式。)

如果你确实需要的正则表达式,find -regex 'pattern'是你的朋友。默认情况下,find将遍历子目录;你可以用-maxdepth 1来避免这种情况。

也许你也可以看看Bash的extended globbing中间选项。

相关问题