如何"grep"文件名而不是文件内容?

Cod*_*lue 130 grep

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

例如,如果我想找到所有以"f"开头并以.frm结尾的VB表单文件,我将使用正则表达式 -

   "f[[:alnum:]]*\.frm"
Run Code Online (Sandbox Code Playgroud)

grep可以这样做吗?如果没有,是否有一个实用程序可以让我这样做?谢谢.

Pab*_*ruz 114

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

您还可以findgrep或组合使用egrep:

$ find | grep "f[[:alnum:]]\.frm"
Run Code Online (Sandbox Code Playgroud)

  • 这是不必要的.Find具有使用`-regex`选项内置的功能. (12认同)
  • 这里没有必要,但grep支持perl正则表达式,而find则不支持. (4认同)
  • 不,您可以使用grep。比使用find更容易。添加开关“ -rl”,它将搜索文件名而不是文件。请参阅下面的我的帖子。 (2认同)
  • @RM:不,仍然搜索文件内容。它只是*打印*文件名而不是打印匹配的行。 (2认同)

whe*_*den 44

作为巴勃罗说,你需要使用find的,而不是grep,但没有必要管findgrep.find具有内置的功能:

find . -regex 'f[[:alnum:]]\.frm'
Run Code Online (Sandbox Code Playgroud)

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

  • 此外,-regex 开关对整个路径执行匹配。因此,要使示例正常工作,需要在正则表达式开头添加 .*。 (2认同)

jav*_*e42 43

find <path> -name *FileName*
Run Code Online (Sandbox Code Playgroud)

来自手册:

找到-name模式

文件名的基础(删除了前导目录的路径)与shell模式模式匹配.因为删除了前导目录,所以考虑与-name匹配的文件名永远不会包含斜杠,因此"-name a/b"将永远不会匹配任何内容(您可能需要使用-path).元字符("*","?"和"[]")匹配"." 在基本名称的开头(这是find- utils-4.2.2的更改;请参阅下面的标准一致性部分).要忽略目录及其下的文件,请使用-prune; 请参阅-path描述中的示例.大括号不被认为是特殊的,尽管有些贝壳包括Bash在贝壳图案中具有特殊含义的支撑.使用fnmatch(3)库函数执行文件名匹配.不要忘记将模式用引号括起来,以防止它被shell扩展.

  • 我发现这个答案是最有用的。我添加了几个额外的选项:`find 。-maxdepth 1 -name "*文件名*" -print` (5认同)

小智 14

最简单的方法是

find . | grep test
Run Code Online (Sandbox Code Playgroud)

这里find会递归的列出(.)中的所有文件,即当前目录。

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

您可以根据需要使用grep。注意:因为 grep 是一个通用的字符串分类。它可能会导致不仅为您提供文件名。但是如果路径有一个目录 ('/xyz_test_123/other.txt'),它也将是结果集的一部分。


jas*_*ard 13

您可以使用grep找到文件的完整路径,只需管道树的输出

tree -f | grep filename
Run Code Online (Sandbox Code Playgroud)

这是一个可以放入.bash_profile或.bashrc的函数

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


Sir*_*dda 10

find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here
Run Code Online (Sandbox Code Playgroud)

type_descriptor类型: -

f:常规文件

d:目录

l:符号链接

c:角色设备

b:阻止设备


dar*_*der 6

find . | grep KeywordToSearch
Run Code Online (Sandbox Code Playgroud)

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

注意:这区分大小写。例如fileNameFileName并不相同。


cay*_*lus 5

你也可以这样做:

tree | grep filename
Run Code Online (Sandbox Code Playgroud)

这会将tree命令的输出传递给grep以进行搜索.这只会告诉您文件是否存在.