grep für Dateien und öffnen Sie die resultierenden Übereinstimmungen

grep für Dateien und öffnen Sie die resultierenden Übereinstimmungen

Ich versuche, alle Dateien basierend auf einigen Rückgabewerten von grep in der Befehlszeile zu öffnen. Ich weiß, dass ich die -lOption verwenden kann, nur Dateinamen zurückzugeben, aber ich möchte dies irgendwie mit einer anderen Reihe von Flags oder Argumenten kombinieren, um die vollständigen Pfade der besagten Dateien zu erhalten.

Ich habe so etwas versucht:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

Und auch so etwas wie:

grep -HR -l mystring . | xargs open

Mit wenig Erfolg. Beachten Sie, dass ich auch in alle Unterverzeichnisse rekursiv vorgehen möchte. Ich sahdiese Frage, was nicht ganz passt.

AKTUALISIEREN:

Ich konnte diese Art der Arbeit mit

grep -HR -l mystring . | xargs -L 1 open

Das Problem besteht darin, dass die Befehlszeile bei vielen Dateien zwei Probleme meldet:

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist, wobei der Pfad ein Leerzeichen enthält.

Antwort1

Wenn die Dateinamen Leerzeichen enthalten, müssen Sie print0die Option für „Datei“, „später“ -0für xargs„und „zuletzt“ -I {}für „zweite“ verwenden xargs.

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

Getestet mit emacsals openBefehl.

Antwort2

-execübernimmt den Exit-Status des eingegebenen Befehls und verwendet ihn logisch innerhalbfind

So etwas Einfaches wie das hier sollte funktionieren

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

Antwort3

Ich bin nicht sicher, welche Version grepSie verwenden, aber wenn ich die Manpage greprichtig lese, wird der Scan nach dem ersten erfolgreichen Treffer gestoppt. Ist das, was Sie wollen? Ich habe Ihre Frage so verstanden, dass Sie „alle Dateien öffnen“ wollten.

Wenn es Ihnen nichts ausmacht, vimoder zu verwenden gvim, können Sie Folgendes verwenden:

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(Ich habe nie versucht, diese beiden Befehle zu kombinieren, da / von vimnicht gelesen wird .)quickfixerrorfilestdin

Vim öffnet die erste Datei in /tmp/mystring.listund platziert den Cursor direkt in der Zeile, in der mystringgefunden wurde. Sie können zur nächsten Instanz mit :cnund zur vorherigen Instanz mit gehen :cp.

Wenn Sie kein vimBenutzer sind und die verlinkte Frage Ihnen nicht viel geholfen hat, find ... -print0sollte – wie bereits vorgeschlagen – Folgendes helfen.

Antwort4

Verwenden pwddurch Finden:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

verwandte Informationen