我如何“ grep”为一个文件名而不是文件的内容?

Grep 用于在文件中搜索,以查看是否有任何一行与给定的正则表达式匹配。但是,我遇到了这种情况-我想编写一个正则表达式,它将匹配文件名本身(而不是文件的内容)。我将从系统的根目录运行它,以查找所有与正则表达式匹配的文件。

例如,如果我想找到所有以“ f”开头、以“ f”结尾的 VisualBasic表单文件。From,我将使用正则表达式-

   "f[[:alnum:]]*\.frm"

Grep 可以这样做吗? 如果不行,是否有一个实用程序可以让我这样做?

524216 次浏览

在这种情况下,需要使用 find而不是 grep

你也可以将 findgrepegrep结合使用:

$ find | grep "f[[:alnum:]]\.frm"

正如 Pablo 所说,您需要使用 find而不是 grep,但是没有必要将 find通过管道连接到 grepfind内置了这一功能:

find . -regex 'f[[:alnum:]]\.frm'

find是一个非常强大的程序,用于按名称搜索文件,并支持按文件类型搜索,深度限制,结合不同的搜索条件与布尔操作,并执行任意命令的找到的文件。有关更多信息,请参见 查找手册页

find -iname "file_name"


Syntax:
find -type type_descriptor file_name_here

Type _ criptor type:

普通档案

D: 目录

符号链接

字符设备

B: 块状装置

你也可以这样做:

tree | grep filename

这会将 tree 命令的输出通过管道传递给 grep 以进行搜索。但是,这只会告诉您该文件是否存在。

你可以使用树来找到文件的相对路径,只需要管道输出到 grep 来过滤:

tree -f | grep filename

这里有一个函数,你可以把你的 .bash_profile.bashrc.zshrc或其他..。

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

例子

find <path> -name '*FileName*'

手册:

查找名称模式查找名称模式

文件名的基础(删除前导目录的路径)匹配 shell 模式。 因为前导目录被删除,所以考虑与-name 匹配的文件名永远不会被删除 包含一个斜杠,所以“-name a/b”将永远不会匹配任何内容(您可能需要改为使用-path) 元字符(“ *”,“ ?”和“[]”匹配在基名称的开头(这是 find-的更改 Utils-4.2.2; 参见下面的 STANDARDS CONFORMANCE 部分), Use-prune; 请参见-path 描述中的示例。牙套不被认为是特殊的, 尽管包括 Bash 在内的一些 shell 在 shell 模式中具有特殊含义。 使用 fnmatch (3)库函数执行文件名匹配。别忘了 用引号引起模式,以保护它不被 shell 扩展。

不 Grep 在这方面做得很好:

 grep -rl "filename" [starting point]


grep -rL "not in filename"

还有多个文件。

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

最简单的方法是

find . | grep test

这里 找到将列出(.)中的所有文件,即 工作目录递归。

然后它只是一个简单的 grep,所有名称为“ test”的文件都会出现。

你可以按照你的要求使用 Grep。 注意: 因为 grep 是一个通用的字符串分类。它可能导致不仅提供文件名。但是如果一个路径有一个目录(’/xyz _ test _ 123/other. txt’) ,那么它也将是结果集的一部分。

find . | grep KeywordToSearch

在这里,.表示工作目录,它是 找到命令的 路径参数的值。它通过管道到 grep 来搜索应该返回所有匹配结果的关键字。

注意: 这是区分大小写的,所以例如 fileNameFileName是不一样的。