ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Linux 上使用 grep 仅显示文件名? [关闭]

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为 Stack Overflow 的主题。 4个月前关闭。社区在 4 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决 改进此问题

如何在 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' ./* 效果很好!

P
Peter Mortensen

标准选项 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


-H 还显示匹配本身。问题只是文件名。
@Hauke我的回答是-l。我提到 -H 只是因为问题中的用户命令包含 -H 并且在给出 -l 时它是多余的。
很好,我个人喜欢在递归查找一组子文件夹中的文本时将它与其他标志 grep -nrl "some text" . 一起使用
ell的助记词是什么?
“匹配的文件”
I
Ignacio Vazquez-Abrams

grep(1) 手册页:

-l, --files-with-matches 禁止正常输出;而是打印通常会从中打印输出的每个输入文件的名称。扫描将在第一次匹配时停止。 (-l 由 POSIX 指定。)


停在第一场比赛是必要和自然的。
文档使它有点不清楚。 “扫描将在第一次匹配时停止” - 表示将打印所有文件名,但匹配单词的扫描将在第一次出现时停止。
@VishalP:由于我们不关心出现的位置,只关心它们的存在,因此在第一次出现之后搜索每个文件是没有意义的。
@IgnacioVazquez-Abrams 正是。文件的第一印象让你觉得它只会打印第一个文件的文件名。你真的需要读几本书才能理解它。
'当前文件的扫描将在第一次匹配时停止。'会清楚得多。
P
Peter Mortensen

对于简单的文件搜索,您可以使用 grep 的 -l-r 选项:

grep -rl "mystring"

所有的搜索都是由 grep 完成的。当然,如果您需要在其他参数上选择文件,find 是正确的解决方案:

find . -iname "*.php" -execdir grep -l "mystring" {} +

execdir 选项为每个目录构建每个 grep 命令,并将文件名仅连接到一个命令 (+)。


P
Peter Mortensen

我的命令建议使用路径获取文件名

sudo find /home -name *.php

此命令在我的 Linux 操作系统上的输出:

compose-sample-3/html/mail/contact_me.php


该问题专门询问他们如何使用 grep 获取文件名。
这个命令实际上不会做你所期望的。 Shell 扩展将首先扩展 *.php,然后将结果作为参数 4 提供给 find。使用 find 时,您应该始终使用 \*.php 或 "*.php" 转义文件模式。