使用 时find
,如何在搜索字符串时返回文件名和行号?我设法在一个命令中返回文件名,并在另一命令中返回行号,但我似乎无法将它们组合起来。
文件名:find . -type f -exec grep -l 'string to search' {} \;
行号:find . -type f -exec grep -n 'string to search' {} \;
答案1
答案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 " *