在Ubuntu中使用正则表达式查找文件

5

我有一个任务,需要找到符合一定条件的文件,这些条件可能需要使用正则表达式。

例如:

查找以三个小写字母开头且最后一个字母不是“i”的文件。我正在寻找最好的方法来查找这些文件。

我可以这样做:

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

但是,这似乎有点困难。有什么想法吗?

1
你对于“非i”的范围可以是[a-hj-z],对吧?祝好运。 - shellter
而“no vowels”怎么说呢?[b-df-hj-np-tv-xz] - Bidoubiwa
这是一种方法,但是对于字符类别有一个否定运算符,所以你可以使用 [^aeiou0-9::punct::](如果你只想匹配小写字符)。实际上,[b-d...]也不错,因为它明确列出了你想要匹配的内容,而你不必去猜测你可能会错过哪些“快捷”术语中的::punct::和其他一些。还有其他的::named-ranges::,但我不想让你去找参考资料;-)(我正在恢复手术)。祝你好运。 - shellter
Bash允许使用^进行否定,但是便携式、传统的否定运算符是! - tripleee
@tripleee:感谢提醒。我想在我的脑海里,!是csh的否定符号,所以我试图将那些年份从我的记忆中屏蔽掉;-)。很好的回答!祝大家好运。 - shellter
2个回答

12
$ ls
abci  ASds  dferasfds  dsfa998  ilkj323  retk232i

$ find -regextype egrep -regex '.*/[a-z]{3}.*[^i]$'
./dferasfds
./dsfa998
./ilkj323
  • .*/ 用于匹配文件路径的开头部分
  • [a-z]{3} 匹配三个小写字母
  • .* 匹配任何其他字符
  • [^i]$ 不以 i 结尾

然而,这个特定情况似乎可以不需要正则表达式:

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

4
这些是通配符,不是正则表达式。您不需要使用正则表达式来完成此操作。
printf '%s\n' [a-z][a-z][a-z]*[!i] [a-z][a-z][a-hj-z]

第二个模式涵盖了文件名为三个字符长的情况;根据您的要求,是否应该包括这些文件名并不清楚。(如果没有匹配的文件存在,Shell将发出警告消息,但这是无害的。)如果不需要,请使用第一个模式。
(我主要使用printf来说明Shell在这里实际工作,而ls不必扩展glob模式。)
如果您确实需要正则表达式,则find -regex 'pattern' 是您的好帮手。默认情况下,find会遍历子目录;您可以使用-maxdepth 1来避免这种情况。
也许还可以看一下Bash的扩展globbing,这是一个中间选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接