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


135

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

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

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

grep可以这样做吗?如果没有,是否有可以让我执行此操作的实用程序?谢谢。

Answers:


120

在这种情况下,您需要使用find代替grep

您也可以find结合使用grepegrep

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

12
这是不必要的。Find具有该-regex选项内置的功能。
whereswalden 2014年

4
这里没有必要,但是grep支持perl regex,而find不支持。
丹·丹

2
不,您可以使用grep。比使用find更容易。添加开关“ -rl”,它将搜索文件名而不是文件。请参阅下面的我的帖子。
RM

@ alpha_989,我说过grep支持它,它确实做到了:gnu.org/software/grep/manual/html_node/… 指向管道grep仅在需要pcre时才需要。whereswalden的答案正确
Dan

60

find <path> -name *FileName*

从手册:

查找名称模式

文件名的基础(除去前导目录的路径)与外壳模式模式匹配。由于删除了前导目录,因此考虑与-name匹配的文件名将永远不会包含斜杠,因此“ -name a / b”将不会与任何内容匹配(您可能需要使用-path)。元字符(“ *”,“?”和“ []”)与“。”匹配。基本名称的开头(这是findutils-4.2.2的更改;请参见下面的“标准符合性”部分)。要忽略目录及其下的文件,请使用-prune;。请参阅-path的描述中的示例。括号未被认为是特殊的,尽管事实上,包括Bash在内的某些外壳在外壳样式中赋予了特殊含义。使用fnmatch(3)库函数执行文件名匹配。不要忘记将模式用引号引起来,以防止它被外壳扩展。


2
我发现这个答案是最有用的。我添加了几个其他选项: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

正如Pablo所说,您需要使用find代替grep,但是不需要通过管道find传递到grepfind具有内置的功能:

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

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


1
我要添加非常方便的查找功能,以便使用-mtime-mmin
Johnride 14'Nov

1
另外,-regex开关与整个路径进行匹配。因此,要运行该示例,需要在正则表达式开始处添加。*。
tumasgiu

15

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

tree -f | grep filename

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

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

-f是可选的。
jasonleonhard


5

您也可以这样做:

tree | grep filename

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


1

不,grep可以满足以下要求:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
这会在文件内容中搜索“文件名”,然后打印匹配的文件名。OP想要匹配的文件名,而不是文件内容。
马修(Matthew)

1
同意,这并不文件名搜索,它只是打印了它的发现文件名的名称,内容匹配。您误解了-l-L选项。
Prometheus

2
+1正是我所需要的。很高兴,我不必批评这个问题就能找到所需的答案
Alexander McNulty


-1

最简单的方法是

find . | grep test

在这里find将递归列出(。)即当前目录中的所有文件。然后,这只是一个简单的grep。名称为“ test”的所有文件都会出现。

您可以根据需要使用grep。注意:由于grep是通用字符串分类,因此它不仅会给您提供文件名。但是,如果路径中有目录('/xyz_test_123/other.txt'),那么结果集也会出现。干杯


这将在路径中找到带有“ test”的任何内容,例如./foo/bar/latest/fred.txt
Paul R

哦。我没想到的那个。谢谢您的提及。
sachyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.