Grep, ignore les avertissements

36

J'essaie de trouver le répertoire d'installation d'un paquet particulier. J'ai un certain mot clé avec lequel j'essaie de trouver un fichier particulier.

Au cours de grep, je souhaite uniquement inclure le type de fichier cpp ou h . Je ne souhaite pas que grep affiche des avertissements comme Autorisation refusée ou Impossible de trouver le répertoire . Je veux juste qu'il affiche des fichiers correspondants, rien d'autre. Veuillez suggérer comment puis-je faire cela?

Actuellement, j'utilise

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
    
posée Neeraj Gupta 26.03.2011 - 15:22
la source

5 réponses

42

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

    
réponse donnée James Henstridge 26.03.2011 - 15:26
la source
20

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

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

Cette option présente certains problèmes de compatibilité. Cependant, cela ne devrait pas poser de problème pour un usage personnel.

  

-s, --no-messages:                 Supprimer les messages d'erreur relatifs aux fichiers inexistants ou illisibles. Note de portabilité: contrairement à GNU grep, la 7ème édition Unix grep   pas conforme à POSIX, car il                 il manquait -q et son option -s se comportait comme l'option -q de GNU grep. Grep de style USG aussi manquait -q mais son option -s se comportait comme   GNU grep. Scripts shell portables                 devrait éviter à la fois -q et -s et rediriger plutôt la sortie standard et l'erreur vers / dev / null. (-s est spécifié par POSIX.)

    
réponse donnée Sebastian vom Meer 25.05.2013 - 16:15
la source
4

J'avais l'habitude d'obtenir 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 effectue automatiquement une recherche récursive, vous pouvez utiliser skip à la place.

La manière la plus simple de gérer cela est de la définir dans une variable d'environnement. En ~/.bash_profile ou ~/.bashrc selon votre distribution:

export GREP_OPTIONS='--directories=recurse'

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

Une autre option est l’indicateur --no-messages , raccourci -s . Cela supprimera é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, cela ne vous le dira pas.

    
réponse donnée andrewtweber 02.10.2015 - 23:28
la source
0

Lorsque vous effectuez des recherches récursives dans des fichiers spécifiques, vous avez intérêt à utiliser ack-grep . La syntaxe serait ici:

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

Mais éventuellement, si vous souhaitez rechercher des paquets installés, examinez ces différentes options: lien

    
réponse donnée dargaud 25.07.2014 - 17:12
la source
0

Une autre approche au lieu de faire grep de manière récursive avec -ir serait de laisser la commande find (par défaut récursive) gérer les autorisations avec -readable flag et chemin à exclure avec les indicateurs -not -path "*.svn*" et transmettez ensuite le fichier à grep . L'exclusion des répertoires se fait via -type f pour trouver uniquement des fichiers réguliers.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
    
réponse donnée Sergiy Kolodyazhnyy 05.02.2017 - 19:10
la source

Lire d'autres questions sur les étiquettes