2 votes

Comment faire pour que grep (non-gnu-)ignore les fichiers binaires ?

Hé, je suis sur un serveur HP-UX ici. Lors de l'interrogation récursive d'une arborescence de répertoires, j'ai des problèmes lorsque l'arborescence contient également des fichiers binaires : grep les traite comme des fichiers texte et affiche de très longues lignes contenant beaucoup de caractères non imprimables. Cela ne rend pas seulement la sortie difficile à analyser, mais rend aussi souvent mon terminal inutilisable (et écrit de drôles de chaînes dans son titre).

GNU-grep possède une option --binary-file= qui pourrait aider (et il n'imprime pas la ligne correspondante de toute façon pour les fichiers binaires), mais je n'ai pas GNU-tools à disposition.

Existe-t-il un moyen de simuler le comportement de GNU-grep ou d'ignorer les fichiers qui semblent être binaires ?

Par ailleurs, s'il existe un moyen facile de faire cela en perl, ce serait bien aussi.

3voto

Eric Noob Points 531

Dans le prolongement de la réponse précédente, vous pouvez utiliser la commande "file" pour identifier les fichiers texte, puis limiter votre grep à ces seuls fichiers. Par exemple :

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

C'est :

  • Trouver tous les fichiers du répertoire "dir".
  • Passez-les comme arguments à "file".
  • Recherchez la sortie de "fichier" contenant le mot "texte".
  • Découpez le premier champ délimité par deux points et utilisez-le comme nom de fichier.
  • Recherchez ces fichiers en utilisant grep.

Ceci échouera dans le cas de noms de fichiers contenant des espaces ou des deux-points, mais fera autrement ce que vous voulez.

0 votes

Celui-ci fonctionne un peu mieux, mais la commande file sur hp-ux semble être aussi mauvaise que la commande grep - 'file | grep text' n'est pas suffisant pour éliminer les fichiers binaires

1voto

Kyle Brandt Points 81077

Il y a peut-être un meilleur moyen, mais peut-être passer tous les fichiers à une boucle Shell, et faire quelque chose comme ce qui suit avec la commande file :

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

... ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X