如何对“locate”命令的结果采取行动?

如何对“locate”命令的结果采取行动?

我试图找到'文件check_dns中定义的位置,尽管有很多文件。nagioscommands.cfg

我知道我可以运行类似find / -name "command.cfg" -exec grep check_dns {} \;搜索匹配项的操作,但如果可能的话我想使用它,locate因为它是索引副本并且速度更快。

当我运行时,locate commands.cfg我得到以下结果:

/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg

是否可以运行locate并将其通过管道传输到类似的内联命令xargs或其他命令,以便我可以获得grep每个结果?我意识到这可以通过 for 循环来完成,但我希望在这里了解一些 bash-fu / shell-fu ,而不是如何针对这个特定情况执行此操作。

答案1

是的,你可以用xargs这个。

例如一个简单的:

$ locate commands.cfg | xargs grep check_dns

(当grep看到多个文件时,它会在每个文件中进行搜索并启用匹配的文件名打印。)

或者您可以通过以下方式显式启用文件名打印:

$ locate commands.cfg | xargs grep -H check_dns

(以防万一仅grep使用 1 个参数调用xargs

对于只接受一个文件名参数的程序(与 不同grep),您可以限制提供的参数数量,如下所示:

$ locate commands.cfg | xargs -n1 grep check_dns

这不会打印匹配行所在的文件的名称。

结果相当于:

$ locate commands.cfg | xargs grep -h check_dns

使用现代的locate/xargs,您还可以防止空格问题:

$ locate -0 commands.cfg | xargs -0 grep -H check_dns

(默认情况下,空格分隔输入xargs- 当您的文件名包含空格时,这当然是一个问题......)

相关内容