Como encontrar um texto específico em arquivos com extensão específica?

1

Digamos que eu esteja procurando por todos os arquivos com extensão .log que contenham o texto de abc .

Ao pesquisar arquivos com qualquer extensão, seria semelhante (Ref .: link )

find / -xdev -type f -print0 | xargs -0 grep -H "abc"

Como poderíamos modificar isso para que ele pesquisasse apenas arquivos com extensão .log ?

Ficarei mais do que feliz se você mostrar um comando melhor.

    
por Askar 14.04.2016 / 03:33

1 resposta

3

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:

  1. Listar arquivos que correspondem ao padrão *.log
  2. Execute grep por cada arquivo para descobrir se ele contém ou não uma string específica.
  3. 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 chamando grep 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ção execve 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 para execve para empacotar como qualquer arquivo possível na frente de grep (o limite é definido pela variável ARG_MAX , é específico para exec e para o Ubuntu está em 2097152 , como pode ser mostrado pelo comando getconf ARG_MAX ). Quando o limite for atingido, exec repetirá a chamada para grep com mais arquivos compactados como argumentos. O \ é necessário para garantir que + seja interpretado como argumento para find 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.
por Sergiy Kolodyazhnyy 14.04.2016 / 03:36