Grep, ignoriere Warnungen


50

Ich versuche, das Installationsverzeichnis eines bestimmten Pakets zu finden. Ich habe ein bestimmtes Schlüsselwort, mit dem ich versuche, eine bestimmte Datei zu finden.

Während grep möchte ich nur den Dateityp cpp oder h einschließen . Ich möchte nicht, dass das grep Warnungen wie " Berechtigung verweigert" oder " Verzeichnis nicht gefunden" anzeigt . Ich möchte nur, dass passende Dateien angezeigt werden, sonst nichts. Bitte schlagen Sie vor, wie ich das machen kann.

Zur Zeit benutze ich

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

Antworten:


56

Diese Warnungen beziehen sich auf den stderrStream und nicht auf den Standard-Out-Dateideskriptor. Sie können die stderr-Ausgabe stumm schalten, indem Sie 2>/dev/nullsie am Ende Ihres Befehls einfügen .


find . 2>/dev/null | grep 404.html
Genauer

30

Sie können die Warnungen nicht nur filtern, sondern auch deaktivieren, indem Sie Folgendes hinzufügen -s:

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

Es gibt einige Kompatibilitätsprobleme mit dieser Option. Dies sollte jedoch kein Problem für den persönlichen Gebrauch sein.

-s, --no-messages: Unterdrückt Fehlermeldungen zu nicht vorhandenen oder nicht lesbaren Dateien. Hinweis zur Portabilität: Im Gegensatz zu GNU grep entsprach Unix grep in der 7. Edition nicht POSIX, da die Option -q fehlte und sich die Option -s wie die Option -q von GNU grep verhielt. USG-style grep fehlte ebenfalls -q, aber die Option -s verhielt sich wie GNU grep. Portable Shell-Skripte sollten sowohl -q als auch -s vermeiden und stattdessen Standard- und Fehlerausgaben nach / dev / null umleiten. (-s wird von POSIX angegeben.)


Ich habe gerade 13.04 installiert und erhalte die Fehler, die ich mit 12.04 nicht bekommen habe. Könnte es sein, dass sich etwas geändert hat? Ich fand es cool, dass grep aufhört, vor Dateien als Verzeichnissen zu warnen, da es mir in den meisten Fällen einfach egal ist!
Alexis Wilke

Entschuldigung, ich bin immer noch am 12.10., Daher kann ich dies nicht bestätigen.
Sebastian vom Meer

5

Früher bekam ich eine Menge nerviger Nachrichten wie diese:

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

Der Grund ist, dass das --directoriesFlag standardmäßig auf gesetzt ist read. Ich habe es geändert zu recurse; Wenn Sie nicht möchten, dass es automatisch eine rekursive Suche durchführt, können Sie skipstattdessen verwenden.

Der einfachste Weg, dies zu tun, besteht darin, es in einer Umgebungsvariablen zu setzen. In ~/.bash_profileoder ~/.bashrcabhängig von Ihrer Distribution:

export GREP_OPTIONS='--directories=recurse'

Jetzt werden diese Nachrichten bei jeder Verwendung von grep automatisch unterdrückt.

Eine weitere Option ist die --no-messagesKurzform flag -s. Dadurch werden auch die Is a directoryNachrichten entfernt, es werden jedoch auch andere Nachrichten unterdrückt, die möglicherweise nützlicher sind. Wenn Sie beispielsweise eine verschachtelte Suche durchführen */*/*und keine solche Datei mit diesem Muster vorhanden ist, wird Ihnen dies nicht mitgeteilt.


gute erklärung
aldr

1

Ein alternativer Ansatz, anstatt greprekursiv mit -ir zu arbeiten, besteht darin, den findBefehl (der standardmäßig rekursiv ist) die Berechtigungen mit -readableFlag und Pfad behandeln zu lassen, um sie mit -not -path "*.svn*"Flags auszuschließen , und die Datei dann an zu übergeben grep. Das Ausschließen von Verzeichnissen erfolgt über, -type fum nur normale Dateien zu finden.

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

0

Bei der rekursiven Suche in bestimmten Dateien ist die Verwendung von viel besser ack-grep. Die Syntax hier wäre:

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

Um die Berechtigungsfehlermeldungen zu entfernen, möchten Sie möglicherweise denselben Befehl ausführen mit sudo:

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

Wenn Sie jedoch nach installierten Paketen suchen möchten, sehen Sie sich diese verschiedenen Optionen an: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.