假设我正在搜索所有.log
扩展名包含文本的文件abc
。
当搜索具有任何扩展名的文件时,看起来像(参考:https://unix.stackexchange.com/a/16140/38353)
find / -xdev -type f -print0 | xargs -0 grep -H "abc"
我们如何修改它以便它只搜索带有.log
扩展名的文件?
如果您能表现出更好的指挥能力,我会非常高兴。
答案1
总结
添加到命令-iname "*.log"
后面。有关详细信息,请参阅手册页/
find
更详细的答案
当前的任务如下:
- 列出与模式匹配的文件
*.log
- 执行
grep
每个文件来查找它是否包含特定的字符串。 - 列出匹配的文件名
stdout
如何实现这一点的示例如下:
$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+
本质上有三件事在起作用:
find
grep
执行查找文件和调用结构中每个文件名列表的任务-exec ...{} \+
,其中{}
将替换找到的所有文件名。-iname "*.log"
可以提供不区分大小写的文件名匹配-exec . . .{} \+
调用低级execve
函数,该函数将生成grep -l
在其前面找到的所有文件的列表(在 的位置{}
)。- 是指定打包 前面尽可能多的文件
\+
的选项(限制由变量设置,特定于,对于 Ubuntu 来说,为 ,如命令 所示)。一旦达到限制,将重复调用 ,并将更多文件打包为参数。有必要确保被解释为 的参数,而不是另一个 shell 命令。execve
grep
ARG_MAX
exec
2097152
getconf ARG_MAX
exec
grep
\
+
find
- 选项
-l
或 grep 显示具有匹配字符串的文件。-L
将匹配没有字符串的文件。