Grep, ignore les avertissements

51

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 souhaite uniquement inclure le type de fichier cpp ou h . Je ne veux pas que le grep affiche des avertissements tels que 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} ./
Neeraj Gupta
la source

Réponses:

58

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

James Henstridge
la source
Soyez plus précis, find . 2>/dev/null | grep 404.htmlc'est à quoi ressemblerait une commande
csga5000
30

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 sur la 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 l'option -q mais son option -s se comportait comme GNU grep. Les scripts de shell portables devraient éviter à la fois les options -q et -s et devraient plutôt rediriger les sorties standard et d'erreur vers / dev / null. (-s est spécifié par POSIX.)

Sebastian vom Meer
la source
Je viens d'installer 13.04 et j'obtiens les erreurs que je ne recevais pas avec 12.04. Serait-ce que quelque chose a changé? Je pensais que c’était cool que grep arrête de mettre en garde sur le fait que les fichiers sont des répertoires, car dans la plupart des cas, cela m’importe!
Alexis Wilke
Désolé, je suis toujours sur 12.10, donc je ne peux pas le confirmer.
Sebastian vom Meer
5

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 --directoriesdrapeau est paramétré par défaut read. Je l'ai changé pour recurse; si vous ne voulez pas qu'il fasse automatiquement une recherche récursive, vous pouvez utiliser à la skipplace.

Le moyen le plus simple de gérer cela en permanence est de le définir dans une variable d'environnement. Dans ~/.bash_profileou ~/.bashrcselon votre distribution:

export GREP_OPTIONS='--directories=recurse'

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

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

Andrewtweber
la source
bonne explication
aldr
1

Une approche alternative au lieu de procéder de grepmanière récursive -ir serait de laisser la findcommande (qui est récursive par défaut) de gérer les autorisations avec -readableindicateur et le chemin à exclure avec -not -path "*.svn*"indicateurs, puis de transmettre le fichier à grep. L'exclusion de répertoires est effectuée via -type fpour ne rechercher que des fichiers normaux.

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

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.

Dargaud
la source