如何在 Linux 中 grep 搜索文件名而不是内容

x33g5p2x  于2022-07-26 转载在 Linux  
字(0.9k)|赞(0)|评价(0)|浏览(425)

grep 是一个 Linux 工具,通常用于在文本文件中搜索特定内容。但是,在目录中搜索文件名而不是文件内容通常很有用,这可以通过grep 其他 Linux 命令行实用程序来完成

使用 find 而不是 grep

该grep 实用程序实质上从文件或标准输入中获取字符串输入,并使用模式或正则表达式对其进行搜索并打印匹配的行。

从技术上讲,您可以单独使用grep 它来搜索文件名而不是内容,但这只是因为 Linux 允许在文件名输入中使用通配符。但是,您可以使用ls 这种方式轻松地列出文件,或在任何其他命令中使用通配符,但它并不是像grep 搜索内容那样搜索文件名的真正解决方案。

grep "" ./file* -l

真正的解决方案是使用该find 实用程序,该实用程序可以搜索子目录并提供最具弹性的方式来搜索文件,因为它直接与文件系统交互。这是搜索目录时最常用的实用程序,它有很多选项——包括模式匹配和正则表达式支持。

最基本的用法是单独使用find 来打印出文件列表,包括子目录,并将该输入提供给grep. 如果您已经有使用 的脚本grep,那么通过这种方式将它们转换为匹配将非常容易。

find | grep "file"

您也可以直接使用模式find,而无需grep. -iname 与输入一起使用。

find . -iname 'file_*.txt'

grep 然而,与此不同的是,该find命令更加严格——您需要使用单引号或双引号来转义搜索字符串,并且您需要使用通配符来匹配整个字符串。如果不使用通配符来匹配名称的其余部分,则无法简单地在名称中查找子字符串。

使用正则表达式 (Regex) 和 find

您还可以使用正则表达式 with find,它允许更高级的匹配:

find . -regex './file.*'

此正则表达式将匹配当前目录中以“file”开头的所有文件。但是,重要的是要知道这与 ; 的工作方式不同-iname。输入包括完整的目录路径,并且必须用于./ 转义相对路径, ./.

此处显示的此命令不包括./subdirectory/ 文件夹,因为它不是以“文件”开头的。要解决此问题,您必须将导致最终正斜杠的所有内容与.*/:

find . -regex '.*/file.*'

正则表达式非常复杂,但非常强大。

相关文章