Linux 如何将“find”与“grep”结合使用以获取文件中的特定信息,并包括找到信息的文件名?

Linux 如何将“find”与“grep”结合使用以获取文件中的特定信息,并包括找到信息的文件名?,linux,bash,grep,find,Linux,Bash,Grep,Find,我非常熟悉使用find和-exec,事实上它已经成为我个人最喜欢的BASH命令之一,因为它在视觉上看起来非常酷,而且功能强大,非常有用 我需要在VPS上找到包含在某些文件中的字符串,目录结构太大,我无法手动查找包含该字符串的文件,因此我认为这是find-exec grep的完美工作 我拥有的命令的完整语法如下所示: 查找。/-键入f-name*-exec grep部分以了解更多信息。{} \; …这非常有助于确认此字符串实际上在某些文件中找到……但哪些文件?我很想知道是否有一种语法来显示哪些文件

我非常熟悉使用find和-exec,事实上它已经成为我个人最喜欢的BASH命令之一,因为它在视觉上看起来非常酷,而且功能强大,非常有用

我需要在VPS上找到包含在某些文件中的字符串,目录结构太大,我无法手动查找包含该字符串的文件,因此我认为这是find-exec grep的完美工作

我拥有的命令的完整语法如下所示:

查找。/-键入f-name*-exec grep部分以了解更多信息。{} \;

…这非常有助于确认此字符串实际上在某些文件中找到……但哪些文件?我很想知道是否有一种语法来显示哪些文件包含字符串,最好是包含字符串的完整路径,尽管我想这不是强制性的

提前谢谢

POSIX grep仅在指定多个文件名时才会输出文件名。因此,典型的技巧是添加/dev/null,以确保始终存在多个:

find ./ -type f -name "*.*" -exec grep "for more information." /dev/null {} \;
GNU和BusyBox greps还有一个可以使用的-H:

   -H, --with-filename
          Print the file name for each match.  This is the default
          when there is more than one file to search.
或者,如果您不关心匹配的行本身,只需要文件名:

find ./ -type f -name "*.*" -exec grep -q "for more information." {} \; -print

我不知道为什么要接受上面的答案,因为它似乎不能解决你最初的问题,但这确实有效

find . -type f | while read f;do grep -q "for more information." $f && echo $f || true;done

这很好用!绝对是我所需要的一切!非常感谢你把关于GNU和BusyBox版本的内容也包括进来,我经常需要在Android上使用同样的东西,所以这比我能解释的还要有用!!非常感谢。为了提高效率,您需要使用find-exec grep'regex'/dev/null{}\+并在末尾加一个加号,而不是分号,它一次在文件集合上运行尽可能少的grep实例,但不能移植到传统的find。如果您正在扫描大量文件,减少进程数量可能会非常有效。您是出于习惯而使用**,还是只想检查文件名中有点的文件?