web-dev-qa-db-fra.com

Grep, ignore 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 le type de fichier cpp ou h. Je ne veux pas que le grep affiche avertissements comme Autorisation refusée ou Impossible de trouver le répertoire . Je veux juste qu'il affiche les fichiers correspondants, rien d'autre. S'il vous plaît suggérer comment puis-je faire cela?

J'utilise actuellement

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

Ces avertissements sont dirigés vers le flux stderr, par opposition au descripteur de fichier standard en sortie. Vous pouvez désactiver la sortie stderr en ajoutant 2>/dev/null à la fin de votre commande.

55
James Henstridge

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

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

Il y a quelques problèmes de compatibilité avec cette option. Cependant, cela ne devrait pas être un problème pour un usage personnel.

-s, --no-messages: supprime les messages d'erreur concernant des fichiers inexistants ou illisibles. Note de portabilité: contrairement à GNU grep, grep n'était pas conforme à POSIX dans la 7e édition, car il lui manquait l'option -q et son option -s se comportait comme l'option -q de GNU grep. De même, grep manquait de -q dans le style USG, mais son option -s se comportait comme GNU grep. Les scripts shell portables doivent éviter à la fois les options -q et -s et rediriger plutôt les sorties standard et les erreurs vers/dev/null. (-s est spécifié par POSIX.)

28

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 l'indicateur --directories est défini par défaut sur 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.

Le moyen le plus simple de gérer cela constamment est de le définir dans une variable d'environnement. Dans ~/.bash_profile ou ~/.bashrc en fonction de votre distribution:

export GREP_OPTIONS='--directories=recurse'

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

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

4
andrewtweber

Une autre approche au lieu de faire grepavec -ir serait de laisser la commande find(qui est récursive par défaut), de gérer les autorisations avec -readable et les chemins à exclure avec -not -path "*.svn*" flags, puis de transmettre le fichier à grepname__. L’exclusion de répertoires s’effectue via -type f pour ne rechercher que les fichiers normaux.

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

Lorsque vous effectuez des recherches récursives dans des fichiers spécifiques, il vaut mieux utiliser ack-grep. La syntaxe serait la suivante:

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

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

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

Toutefois, si vous souhaitez rechercher des packages installés, examinez ces différentes options: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

0
dargaud