find -name \*.log -print0 |
xargs -0 sh -c 'for i; do head -n 500 $i | fgrep -q myip && echo $i; done
Isso localizará todos os nomes de arquivos terminados em .log
e alimentará essa lista em xargs
. Os -print0
e xargs -0
são comumente usados para usar um byte nulo para finalizar os nomes dos arquivos, para proteger nomes de arquivos que contêm espaços (um byte nulo nunca pode ser usado em um nome de arquivo, portanto, é um delimitador seguro).
xargs
executará o comando dado após xargs
e seus argumentos com tantos nomes de arquivos quantos couberem em uma chamada do comando. Neste caso, o comando dado é sh
(o shell), e este shell recebe um pequeno script de shell para ser executado.
O script de shell é basicamente:
for i; do
head -n 500 $i | fgrep -q myip && echo $i
done
A parte for i
faz um loop sobre todos os argumentos dados ao shell, ou seja, todos os nomes de arquivos. Para cada nome de arquivo, são necessárias as primeiras 500 linhas e a busca pela string dada. fgrep -q
significa que o fgrep pára assim que a string é encontrada; se a string for encontrada, um status de saída "sucesso" será fornecido, caso contrário, "falhará". Finalmente, o && echo $i
significa que, se o comando anterior tiver um status de "sucesso", o eco será executado, o que significa que o nome do arquivo será mostrado se a string for encontrada.