如何在Linux shell脚本中使用正则表达式搜索文件

88
假设我想在Linux的所有子目录中搜索文件名包含python的文件,该如何使用正则表达式进行搜索?请问如何在shell脚本中实现?

grep是其中之一。你也可以使用find。 - rerun
3个回答

148

查找所有的 .py 文件。

find / -name '*.py'

查找文件名中包含单词"python"的文件。

find / -name '*python*'

与上面相同,但是不区分大小写。

find / -iname '*python*'

正则表达式匹配,更加灵活。查找既有以 .py 结尾的文件,又有文件名中包含单词 "python" 的文件。

find / -regex '.*python.*\|.*\.py'

3
如果没有引号,shell 会尝试解释通配符。我们希望由 find 处理通配符,而不是由 shell 处理,因此必须对 * 加上引号。 - John Kugelman
我可以在这里使用所有Perl类型的正则表达式,比如向前查找、向后查找、命名组捕获等吗? - SexyBeast
3
因为这里提到了“-iname”,所以也许有必要提一下“-iregex”,它和“-regex”作用相同,但是不区分大小写(就像“-iname”一样)。 - Tobias Helbich
我希望有一种方法可以通过文件名而不是完整路径名来匹配正则表达式。 - Sridhar Sarnobat
为了仅查找文件名而非完整路径,请在表达式末尾添加 [^/]* - nadapez

-2
如果简单的shell正则表达式足够的话,那么你可以使用find命令。
find /linux -name "*python*"

否则,我建议使用 ack(http://betterthangrep.com/) 。

4
通配符不是正则表达式,也不是“简单的shell正则表达式”。在正则表达式中,没有*通配符,而是一个量词。 - Christopher K.
很不幸,ack 改变了一些重度 grep 用户习惯的行为(例如,在不同行上放置文件名和文本匹配)。这对我来说已经足够成为放弃它的障碍了。 - Sridhar Sarnobat

-5
find / -name "python"

[为达到最低字数要求的占位文本]


4
这不会对文件名进行正则表达式匹配。 - Malcolm Box

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