TL; DR
Adicione -iname "*.log"
após /
ao seu comando find
. Consulte a man page para mais informações
Uma resposta mais detalhada
A tarefa em mãos é a seguinte:
- Listar arquivos que correspondem ao padrão
*.log
- Execute
grep
por cada arquivo para descobrir se ele contém ou não uma string específica. - Listar o nome do arquivo que tem uma correspondência no
stdout
O exemplo de como isso pode ser feito pode ser visto abaixo:
$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+
Essencialmente, há 3 coisas em jogo:
-
find
faz o trabalho de localizar arquivos E chamandogrep
por lista de nomes de arquivos na estrutura-exec ...{} \+
, onde{}
será substituído por todos os nomes de arquivos encontrados. -
-iname "*.log"
pode fornecer correspondência insensível a maiúsculas e minúsculas dos nomes de arquivos -
-exec . . .{} \+
chama a funçãoexecve
de baixo nível que gerarágrep -l
com a lista de todos os arquivos encontrados na frente dela (no lugar de{}
). - O
\+
é a opção que especifica paraexecve
para empacotar como qualquer arquivo possível na frente degrep
(o limite é definido pela variávelARG_MAX
, é específico paraexec
e para o Ubuntu está em2097152
, como pode ser mostrado pelo comandogetconf ARG_MAX
). Quando o limite for atingido,exec
repetirá a chamada paragrep
com mais arquivos compactados como argumentos. O\
é necessário para garantir que+
seja interpretado como argumento parafind
e não como outro comando da shell. - a opção
-l
ou grep mostra arquivos com string correspondente.-L
corresponderia aos arquivos sem a string.