Unter der Annahme, dass das grep-Tool verwendet werden soll, möchte ich im gesamten Dateisystem nach der Textzeichenfolge "800x600" suchen.
Ich habe es versucht:
grep -r 800x600 /
aber es geht nicht.
Was ich glaube, dass mein Befehl tun sollte, ist rekursiv durch alle Dateien / Ordner unter root nach dem Text "800x600" zu suchen und die Suchergebnisse aufzulisten.
Was mache ich falsch?
Permission denied
Fehler? Haben Sie es als root oder als normaler Benutzer ausgeführt?grep -r 800x600 / 2>/dev/null
. Sie können es auch als root ausführen.Antworten:
Normalerweise verwende ich diesen Befehlsstil,
grep
um eine Reihe von Dateien zu überfliegen:Tatsächlich wird eine Liste aller Dateien auf dem System erstellt und anschließend für jede Datei
grep
mit den angegebenen Argumenten und dem Namen jeder Datei ausgeführt.Das
-xdev
Argument sagt find, dass es andere Dateisysteme ignorieren muss - dies ist gut, um spezielle Dateisysteme wie zu vermeiden/proc
. Es werden jedoch auch normale Dateisysteme ignoriert. Wenn sich Ihr / home-Ordner beispielsweise auf einer anderen Partition befindet, wird er nicht durchsuchtfind / /home -xdev ...
.-type f
bedeutet, dass nur nach Dateien gesucht wird. Verzeichnisse, Geräte und andere spezielle Dateien werden ignoriert (es wird weiterhin in Verzeichnisse umgewandelt undgrep
auf die darin enthaltenen Dateien angewendet - es wird nur nichtgrep
auf das Verzeichnis selbst angewendet , was ohnehin nicht funktioniert). Und die-H
Option, ihngrep
anzuweisen, immer den Dateinamen in seiner Ausgabe zu drucken.find
Akzeptiert alle Arten von Optionen zum Filtern der Dateiliste. Zum Beispiel-name '*.txt'
verarbeitet nur Dateien in TXT - Endung.-size -2M
bedeutet Dateien, die kleiner als 2 Megabyte sind.-mtime -5
bedeutet Dateien, die in den letzten fünf Tagen geändert wurden. Fügen Sie diese zusammen mit -a für und -o für oder hinzu und verwenden Sie'('
Klammern')'
, um Ausdrücke zu gruppieren (in Anführungszeichen, um zu verhindern, dass die Shell sie interpretiert). Also zum Beispiel:Schauen
man find
Sie sich die vollständige Liste der möglichen Filter an.quelle
-xdev
ausschließen alle anderen Dateisysteme, nicht nur spezielle. (Wenn Sie/home
beispielsweise eine separate Partition gemountet haben , wird diese nicht durchsucht.)find: paths must precede expression: /
xargs
mit vielleicht besserer Effizienz durchzuhalten, indem Sie dies tunfind / -xdev -type f -exec grep -H '800x600' +
.+
Zeichen am Ende desfind
Befehls bewirkt dasselbe wiexargs
: Es erzeugt einengrep
Prozess mit mehreren Argumenten.Normalerweise würden Sie nicht wirklich ALLES auf dem System suchen wollen. Linux verwendet Dateiknoten für alles, so dass einige "Dateien" nicht unbedingt durchsucht werden sollten. Zum Beispiel
/dev/sda
ist das physische Blockgerät für Ihre erste Festplatte. Sie möchten wahrscheinlich die gemounteten Dateisysteme durchsuchen, nicht das Raw-Plattengerät. Es gibt/dev/random
auch Daten, die bei jedem Lesen zufällig ausgespuckt werden. Eine Suche, die wenig Sinn macht. Das/proc
Dateisystem ist in Ihrem Fall ebenfalls problematisch.Ich würde eines von zwei Dingen empfehlen.
Suchen Sie nicht im Stammverzeichnis, sondern nur an den Orten, die möglicherweise nützlich sind. Suchen
/home
oder/usr
oder/etc
getrennt. Die Informationen, nach denen Sie suchen, sind wahrscheinlich von einem bestimmten Typ, sodass sie sich wahrscheinlich sowieso in einem bestimmten Ordner befinden. Konfigurationseinstellungen sollten in sein/etc
. Ihre persönlichen Daten sollten sich in befinden/home
. Wenn Sie die Suche auf einen wichtigen Bereich wie diesen beschränken, werden Ihre Probleme mit rekursiven Greps erheblich reduziert.Schließen Sie problematische Bereiche mit
--exclude-dir
und einer Reihe von Dingen aus, von denen Sie wissen, dass Sie sie nicht benötigen:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Schließlich ist es nicht ungewöhnlich, dass bei einem großen rekursiven Grep einige Fehler auftreten, denen die Berechtigung verweigert wurde. Im normalen Nutzungsverlauf gibt es Dateien, die Ihr Benutzer möglicherweise nicht lesen kann. Solange es sich nur um einige ungerade Dateien handelt und nicht um Dinge wie das Raw-Gerät für Ihre Festplatten oder das gesamte Proc-Dateisystem, ist es in Ordnung, die Fehler einfach zu ignorieren. Tatsächlich können Sie dies in der Befehlszeile tun, indem Sie alle Fehler in never never land senden:
quelle
-I
binäre auszuschließenDer Einfachheit halber würde ich ack-grep vorschlagen . Link zeigt in vielen Fällen, wann
ack-grep
eine bessere Option ist.Zu verwenden ist nach der Installation:
quelle
Eine andere Sichtweise ist die folgende:
quelle
* dann bekomme ich einen / proc / sysrq-Trigger: Input / Output-Fehler
Ihr Befehl funktioniert. Sie erhalten diesen Fehler, weil Sie versuchen, laufende Prozesse nach einer Zeichenfolge zu durchsuchen.
Ich empfehle, Systemverzeichnisse mit auszuschließen
grep -exclude-dir = {proc, sys} "800x600" /
quelle
einfach richtig
- Was in Ihrem aktuellen Befehl nicht stimmt, sind die Anführungszeichen "". Setzen Sie das Zeichenfolgenargument immer
grep
in Anführungszeichen.quelle
grep
. Probieren Sie es aus und Sie werden sehen. Geben Sie die Zeichenfolge "800x600" in eine Datei ein,grep 800x600 file
und Sie werden sehen, dass sie einwandfrei funktioniert. Das OP hat offensichtlich ein anderes Problem.