如何在 Linux 上使用 grep 仅显示文件名?
Posted
技术标签:
【中文标题】如何在 Linux 上使用 grep 仅显示文件名?【英文标题】:How can I use grep to show just filenames on Linux? 【发布时间】:2011-10-02 01:06:46 【问题描述】:如何在 Linux 上使用 grep 仅显示文件名(无内嵌匹配)?
我通常使用类似的东西:
find . -iname "*php" -exec grep -H myString \;
我怎样才能获得文件名(带路径),但没有匹配项?我必须使用xargs 吗?我没有在我的 grep 手册页上看到这样做的方法。
【问题讨论】:
你的意思是,你想要至少有一个匹配的文件名? 好问题。我实际上开始使用它来打开 Vim 中 grep 返回的文件列表。vim $(grep -rl Something app/)
您不能使用 grep 命令列出文件,它主要用于从文件或列表中获取所需的文本。例如,ps aux | grep 'apt-get' 或 grep 'text-to-find' /path/to/file/
@iamjayp 嗯,您也可以使用 grep 命令列出文件。 grep -lr 'text-to-find' ./*
效果很好!
【参考方案1】:
标准选项grep -l
(即小写L)可以做到这一点。
来自Unix standard:
-l
(The letter ell.) Write only the names of files containing selected
lines to standard output. Pathnames are written once per file searched.
If the standard input is searched, a pathname of (standard input) will
be written, in the POSIX locale. In other locales, standard input may be
replaced by something more appropriate in those locales.
在这种情况下,您也不需要-H
。
【讨论】:
这个选项的文档(通常在大多数 man 文件中)非常不清楚!噗……令人惊讶的是,男人怎么会让人头疼。 -H 还显示匹配项本身。问题只是文件名。 @Hauke 我的回答是 -l。我提到 -H 只是因为问题中的用户命令包含 -H 并且在给出 -l 时是多余的。 很好,我个人喜欢在递归查找一组子文件夹中的文本时将它与其他标志grep -nrl "some text" .
一起使用
ell 的助记符是什么?【参考方案2】:
来自grep(1)
手册页:
-l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. (-l is specified by POSIX.)
【讨论】:
在第一场比赛中停下来是必要的和自然的。 文档使它有点不清楚。 “扫描将在第一次匹配时停止” - 表示将打印所有文件名,但匹配单词的扫描将在第一次出现时停止。 @VishalP:由于我们不关心出现的位置,只关心它们的存在,因此在第一次出现之后搜索每个文件是没有意义的。 @IgnacioVazquez-Abrams 没错。文件的第一印象让你觉得它只会打印第一个文件的文件名。你真的需要读几遍才能理解它。 '当前文件的扫描将在第一个匹配时停止。'会更清晰。【参考方案3】:对于简单的文件搜索,您可以使用 grep 的 -l
和 -r
选项:
grep -rl "mystring"
所有的搜索都是由 grep 完成的。当然,如果你需要在其他一些参数上选择文件,find 是正确的解决方案:
find . -iname "*.php" -execdir grep -l "mystring" +
execdir
选项为每个目录构建每个 grep 命令,并将文件名连接成一个命令 (+
)。
【讨论】:
这是一个被严重低估的答案【参考方案4】:我关于获取带有路径的文件名的命令建议
sudo find /home -name *.php
此命令在我的 Linux 操作系统上的输出:
compose-sample-3/html/mail/contact_me.php
【讨论】:
该问题专门询问他们如何使用 grep 获取文件名。 这个命令实际上不会像你期望的那样。 Shell 扩展将首先扩展 *.php,然后将结果作为参数 4 提供给 find。使用 find 时,您应该始终使用 \*.php 或 "*.php" 转义文件模式。 嗨@snakecharmerben 不想制造麻烦,恰恰相反,我想提供一个替代方案,我当时进入 Linux 并想帮助别人以上是关于如何在 Linux 上使用 grep 仅显示文件名?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 grep 在当前目录中搜索具有字符串“hello”但仅显示 .h 和 .cc 文件的所有文件?
linux下查看进程的命令,ps grep 和 ps aux grep 有啥区别啊?