Procura apenas em arquivos de texto simples que não são código-fonte

1

Eu uso o seguinte comando para pesquisar a string ELF em arquivos de texto simples no diretório atual recursivamente:

grep ELF -r .

mas também procura em arquivos binários (por exemplo, arquivo zip, arquivo PDF) e em arquivos de código, como arquivo HTML e .js .

Como posso especificá-lo para pesquisar somente em arquivos de texto simples que não são código-fonte?

    
por Tim 15.03.2015 / 01:46

2 respostas

3

Com o GNU grep, passe --binary-files=without-match para ignorar arquivos binários. Os arquivos de código-fonte são arquivos de texto, então eles serão incluídos nos resultados.

Se você quiser ignorar arquivos de texto com determinadas extensões, use a opção --exclude , por exemplo,

grep -r --exclude='*.html' --exclude='*.js' …

ou você pode incluir apenas arquivos explicitamente correspondentes, por exemplo,

grep -r --include='*.txt' …

Se você deseja ignorar os arquivos de texto que são código-fonte, use o comando file para adivinhar quais arquivos são o código-fonte. Isso usa heurística para detectar o código-fonte como código não-fonte ou vice-versa.

find -type f exec sh -c '
  for x do
    case $(file <"$x") in
      *source*) :;; # looks like source code
      *text*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like binary
    esac
  done
' "REGEXP" {} +

ou

find -type f exec sh -c '
  for x do
    case $(file -i <"$x") in
      text/plain\;*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like source code or binary
    esac
  done
' "REGEXP" {} +

Como alternativa, você pode usar ack em vez de grep. Ack integra um sistema de classificação de arquivos baseado em nomes de arquivos. Ele é voltado para a pesquisa no código-fonte por padrão, mas você pode informá-lo para pesquisar tipos diferentes passando a opção --type . A pesquisa de todos os arquivos com ack pode ajudar.

    
por 16.03.2015 / 00:54
1

Se você quer restringir somente pela extensão do arquivo, você pode usar a opção grep --include:

grep -R --include="*.txt" "pattern" /path/to/dir/

Outra abordagem é eliminar arquivos que não são texto, mas incluirão os arquivos html e js, que após a atualização são excluídos com a opção --exclude, por exemplo:

find /path/to/dir -type f -print | xargs file | grep text | cut -f1 -d: | xargs grep --exclude=\*.{js,html} "pattern"

Onde, como mencionado no comentário, você também pode usar a opção --exclude-from = FILE.

    
por 15.03.2015 / 02:01

Tags