Como eu faço (não-gnu-) grep ignorar arquivos binários?

2

Olá, estou em um servidor HP-UX aqui. Quando recursivamente grepping uma árvore de diretório, eu tenho problemas quando a árvore também contém arquivos binários: O grep trata-os como arquivos de texto e exibe linhas muito longas contendo muitos caracteres não imprimíveis. Isso não só dificulta a saída da verificação, como também torna meu terminal inutilizável (e grava strings engraçadas em seu título).

O GNU-grep tem uma opção --binary-file= que ajudaria (e não imprimirá a linha correspondente de qualquer forma para arquivos binários), mas eu não tenho ferramentas GNU disponíveis.

Existe uma maneira de simular o comportamento do GNU-grep ou ignorar arquivos que parecem ser binários?

Entre. se há uma maneira fácil de fazer isso em perl, isso também seria bom.

    
por 0x89 03.12.2009 / 15:09

2 respostas

3

Com base na resposta anterior, você pode usar o comando "file" para identificar arquivos de texto e limitar seu grep a apenas esses arquivos. Por exemplo:

  find dir -type f -print |
    xargs file |
    grep text |
    cut -f1 -d: |
    xargs grep "expression"

Isso é:

  • Encontrar todos os arquivos no diretório "dir"
  • Passe esses argumentos como "file"
  • Procure a saída de "arquivo" que contém a palavra "texto"
  • Retire o primeiro campo delimitado por dois pontos e use-o como um nome de arquivo
  • Pesquise esses arquivos usando grep.

Isso falhará no caso de nomes de arquivos contendo espaços em branco ou dois-pontos, mas fará o que você quiser.

    
por 03.12.2009 / 22:04
1

Pode haver uma maneira melhor, mas talvez passar todos os arquivos para um loop de shell, e fazer algo parecido com o seguinte com o comando file:

if file "$i" | grep text; then
  ...
fi

...?

    
por 03.12.2009 / 15:21