Como posso agir de acordo com os resultados do comando "locate"?

Como posso agir de acordo com os resultados do comando "locate"?

Estou tentando descobrir onde check_dnsestá definido no arquivo nagios' commands.cfg, embora existam alguns arquivos.

Sei que poderia rodar algo parecido find / -name "command.cfg" -exec grep check_dns {} \;com procurar correspondências, mas se possível gostaria de usar locatejá que é uma cópia indexada e muito mais rápida.

Quando executo locate commands.cfgobtenho os seguintes resultados:

/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

É possível executar localizar e canalizá-lo para um comando embutido como xargsou algo assim para que eu possa obter grepcada um dos resultados? Sei que isso pode ser feito com um loop for, mas estou procurando aprender mais sobre bash-fu / shell-fu aqui do que como fazê-lo para este caso específico.

Responder1

Sim, você pode usar xargspara isso.

Por exemplo um simples:

$ locate commands.cfg | xargs grep check_dns

(Quando grepvê vários arquivos, ele pesquisa em cada um e permite a impressão do nome do arquivo junto com as correspondências.)

Ou você pode ativar explicitamente a impressão do nome do arquivo por meio de:

$ locate commands.cfg | xargs grep -H check_dns

(Caso um grepseja chamado apenas com 1 argumento por xargs)

Para programas que aceitam apenas um argumento de nome de arquivo (ao contrário de grep), você pode restringir o número de argumentos fornecidos assim:

$ locate commands.cfg | xargs -n1 grep check_dns

Isso não imprime os nomes dos arquivos de onde vêm as linhas correspondentes.

O resultado é equivalente a:

$ locate commands.cfg | xargs grep -h check_dns

Com um localizar/xargs moderno, você também pode se proteger contra problemas de espaços em branco:

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

(Por padrão, o espaço em branco separa a entrada de xargs- o que é obviamente um problema quando seus nomes de arquivos contêm espaços em branco ...)

informação relacionada