如何在 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 有啥区别啊?

如何在 Linux 上使用 grep 搜索包含 DOS 行尾 (CRLF) 的文件?

linux怎样用grep过滤

linux查看端口号使用情况

如何在Linux中查看所有正在运行的进程