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

时间:2012-04-18 15:01:12

标签: grep

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

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

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

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

10 个答案:

答案 0 :(得分:104)

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

您还可以将findgrepegrep结合使用:

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

答案 1 :(得分:40)

正如Pablo所说,您需要使用find代替grep,但无需将find传递给grepfind内置了该功能:

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

find是一个非常强大的程序,用于按名称搜索文件,并支持按文件类型搜索,深度限制,将不同的搜索项与布尔运算相结合,以及对找到的文件执行任意命令。有关详细信息,请参阅the find man page

答案 2 :(得分:32)

示例

find <path> -name *FileName*

来自手册:

find -name pattern

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

答案 3 :(得分:11)

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

tree -f | grep filename

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

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

答案 4 :(得分:10)

find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor类型: -

f:常规文件

d:目录

l:符号链接

c:角色设备

b:阻止设备

答案 5 :(得分:5)

你也可以这样做:

tree | grep filename

这将树命令的输出通过管道传输给grep进行搜索。这只会告诉你文件是否存在。

答案 6 :(得分:5)

最简单的方法是

find . | grep test

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

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

答案 7 :(得分:0)

find . | grep KeywordToSearch

此处的 . 表示当前目录,它是 find 命令的 path 参数的值。它通过管道传递给 grep 以搜索应返回所有匹配结果的关键字。

注意:这是区分大小写的。因此,例如 fileNameFileName 是不同的。

答案 8 :(得分:-1)

也用于多个文件。

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

答案 9 :(得分:-2)

不,grep适用于此:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"