Verwenden Sie grep mit dem Flag --exclude-dir, um mehrere Verzeichnisse auszuschließen

15

Ich suche in einer Ruby on Rails-Anwendung unter grepOSX nach einem Wort und möchte Verzeichnisse ausschließen, die einem bestimmten Muster entsprechen.

Ich benutze den folgenden Befehl:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Dieser Befehl tut nicht das, was ich erwartet hatte. Hier ist, wie ich dachte, dass es funktionieren würde:

  • i - Suche ohne Berücksichtigung der Groß- und Kleinschreibung
  • n - Druckzeilennummer, in der das Muster gefunden wird
  • R - Suche rekursiv
  • w - Ich möchte nur ganze Wörter - also "direkt", aber nicht "Verzeichnis"
  • -E - Verwenden Sie einen erweiterten regulären Ausdruck
  • 'direct' - der reguläre Ausdruck, mit dem ich übereinstimmen möchte
  • . - Suche im aktuellen Verzeichnis
  • --exclude-dir -E 'git | log | asset' - schließt Verzeichnisse aus, die git oder log oder asset entsprechen.

In Bezug auf die Exclude- Verzeichnisse sucht der Befehl immer noch in den Verzeichnissen './git' und './log' sowie in './app/assets'.

Mir fehlt offensichtlich ein grundlegendes Stück Wissen, aber ich weiß nicht, was es ist.

Steven L.
quelle

Antworten:

16

Die Beschreibung der Manpage für diese Option ist irreführend ... Es ist ein Muster wie in Globs, nicht ein Muster wie in Regex . Pro infoSeite :

--exclude-dir = GLOB

Überspringen Sie alle Befehlszeilenverzeichnisse mit einem Namenssuffix, das dem Muster GLOB entspricht. Überspringen Sie bei der rekursiven Suche alle Unterverzeichnisse, deren Basisname mit GLOB übereinstimmt. Ignorieren Sie redundante abschließende Schrägstriche in GLOB.

In Ihrem Fall könnten Sie also Folgendes ausführen:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

um benannte Verzeichnisse auszuschließen git, logund assetsoder zB

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

um Verzeichnisnamen auszuschließen, die mit enden gitoder beginnen asset.

don_crissti
quelle
Sehr interessant. Ich denke, ich sollte nachschauen, was ein Globus ist.
Steven L.
Es tut mir leid, aber keine davon scheint zu funktionieren. Wäre es hilfreich, wenn ich sagen würde, dass ich diese Version von grep verwende: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.
Ich bin ratlos, weil ich das Handbuch für bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) lese und --exclude-dir nicht erwähnt wird. Boo.
Steven L.
2
OK - ich sehe das Problem jetzt. Dies muss eine modifizierte Version von grep sein, die nur vom Apple-System verwendet wird. Ich bin auf Mac OS X. Es tut mir leid für die Verwirrung hier. Ich bin mir sicher, dass es irgendwo anders auf stackexchange ein Forum gibt, in dem ich posten kann.
Steven L.
@ user245185 Sind Sie auf BSD oder OSX? Beide sind hier zum Thema, aber bitte bearbeiten Sie Ihre Frage und teilen Sie uns mit, welches Betriebssystem Sie verwenden. Das Verhalten der Standardtools unterscheidet sich zwischen den Implementierungen, wie Sie feststellen.
Terdon
7

--exclude-dirversteht nicht |.

Sie können jedoch den gleichen Effekt erzielen, indem --exclude-dirSie für jedes Verzeichnis, das Sie ausschließen möchten, mehrmals eines angeben:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
quelle
Es hat bei mir funktioniert. Ich wollte das Home-Verzeichnis ausschließen, aber es funktionierte nicht mit anderen Optionen wie --exclude-dir={home}. Ich habe gearbeitet, als ich getippt habe--exclude-dir 'home'
Mubin Icyer