58 votes

Grep, ignorez les avertissements

J'essaie de trouver le répertoire d'installation d'un paquet particulier. J'ai un certain mot-clé à l'aide duquel j'essaie de trouver un fichier particulier.

Pendant grep, je veux seulement inclure cpp ou h type de fichier. Je ne veux pas que le grep montre avertissements comme Permission refusée ou Impossible de trouver le répertoire . Je veux juste qu'il affiche les fichiers appariés, rien d'autre. Veuillez me suggérer comment je peux faire cela ?

Actuellement, j'utilise

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

70voto

Mark S. Rasmussen Points 13313

Ces avertissements sont adressés à la stderr par opposition au descripteur de fichier standard out. Vous pouvez réduire au silence la sortie stderr en ajoutant 2>/dev/null à la fin de votre commande.

34voto

perrohunter Points 1445

Plus directement que filtrer les avertissements, vous pouvez les désactiver en ajoutant -s :

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Cette option pose quelques problèmes de compatibilité. Toutefois, cela ne devrait pas poser de problème pour un usage personnel.

- Supprime les messages d'erreur sur les fichiers inexistants ou illisibles. Note sur la portabilité : contrairement à GNU grep, la 7ème édition de Unix grep n'est pas conforme à [ ] l'option -q et son option -s se comportait comme l'option -q de GNU grep. Le grep de style USG n'avait pas non plus -q mais son option -s se comportait comme le grep de GNU. GNU grep. Les Shell Shell portables devraient éviter à la fois -q et -s et devraient rediriger les sorties standard et d'erreur vers /dev/null à la place. (-s est spécifié par POSIX).

5voto

andrewtweber Points 150

J'avais l'habitude de recevoir une tonne de messages ennuyeux comme celui-ci :

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

La raison en est que le --directories La valeur par défaut du drapeau est read . Je l'ai changé en recurse ; si vous ne voulez pas qu'il fasse automatiquement une recherche récursive, vous pouvez utiliser skip à la place.

La façon la plus simple de gérer cela en permanence est de le définir dans une variable d'environnement. Dans ~/.bash_profile ou ~/.bashrc en fonction de votre distro :

export GREP_OPTIONS='--directories=recurse'

Maintenant, il supprime automatiquement ces messages chaque fois que j'utilise grep.

Une autre option est le --no-messages drapeau, abréviation -s . Cela permettra également de se débarrasser de la Is a directory mais il supprime également d'autres messages qui pourraient être plus utiles. Par exemple, si vous effectuez une recherche imbriquée dans le fichier */*/* et qu'il n'existe aucun fichier de ce type, il ne vous le dira pas.

1voto

Sergiy Kolodyazhnyy Points 97292

Approche alternative au lieu de faire grep récursivement avec -ir serait de laisser find (qui est récursif par défaut) gère les permissions avec la commande -readable et les chemins à exclure avec -not -path "*.svn*" et ensuite passer le fichier à grep . L'exclusion de répertoires se fait via -type f pour ne trouver que les fichiers réguliers.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \;

0voto

Jacob Points 31

Lorsque vous effectuez des recherches récursives dans des fichiers spécifiques, il est préférable d'utiliser l'option ack-grep . La syntaxe serait ici :

ack-grep -i "My term" --cpp --h

Pour supprimer les messages d'erreur de permission, vous pouvez exécuter la même commande avec sudo :

ack-grep -i "My term" --cpp --h

Mais finalement, si vous voulez rechercher des paquets installés, regardez ces différentes options : https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

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