如何使用 find ... -exec grep 返回文件名和行号?

如何使用 find ... -exec grep 返回文件名和行号?

使用 时find,如何在搜索字符串时返回文件名和行号?我设法在一个命令中返回文件名,并在另一命令中返回行号,但我似乎无法将它们组合起来。

文件名:find . -type f -exec grep -l 'string to search' {} \;

行号:find . -type f -exec grep -n 'string to search' {} \;

答案1

命令行开关强制-H打印grep文件名,即使只有一个文件。

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

请注意,作为小次郎说在一条评论,这不是 POSIX 标准的一部分; GNU 和 BSD grep 中都有它,但某些系统可能没有它(例如 Solaris)。

答案2

除非您使用非标准-H-r/-R选项,否则grep仅在传递多个文件名时输出文件名,因此您可以执行以下操作:

find . -type f -exec grep -n 'string to search' /dev/null {} +

使用{} + 语法时,find将根据需要传递尽可能多的文件到grep,而使用 时{} ';',它会为grep每个文件运行一个,效率很低。

我们仍然添加/dev/null(保证存在且为空),以确保grep至少获得两个文件,适用于当前目录或以下目录中只有一个常规文件或文件列表已以find这种方式分割的情况最后一次运行只有一个文件。

作为旁注,如果-exec grep regex {} +,find的退出状态将非零任何grep以非零退出状态终止的调用。如果find无法遍历/读取某些目录或获取文件元数据,它也将是非零。如果find返回的退出状态为零,则意味着find可以遍历所有目录并全部 grep调用成功(找到至少一个具有至少一个匹配项的文件),但如果它返回非零,则不一定意味着未找到匹配项。

对于-exec grep regex {} ';',grep的退出状态仅用于确定-exec谓词(可用作条件)是否成功,而不会反映在find的退出状态中。 sofind的退出状态仅与是否能找到所有文件有关。

答案3

如果您的 grep 支持递归-r标志,这可以解决您的请求:

grep -rn "String to search " * 

相关内容