
Ich versuche, alle Dateien basierend auf einigen Rückgabewerten von grep in der Befehlszeile zu öffnen. Ich weiß, dass ich die -l
Option 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 print0
die Option für „Datei“, „später“ -0
für xargs
„und „zuletzt“ -I {}
für „zweite“ verwenden xargs
.
find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'
Getestet mit emacs
als open
Befehl.
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 grep
Sie verwenden, aber wenn ich die Manpage grep
richtig 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, vim
oder 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 vim
nicht gelesen wird .)quickfix
errorfile
stdin
Vim öffnet die erste Datei in /tmp/mystring.list
und platziert den Cursor direkt in der Zeile, in der mystring
gefunden wurde. Sie können zur nächsten Instanz mit :cn
und zur vorherigen Instanz mit gehen :cp
.
Wenn Sie kein vim
Benutzer sind und die verlinkte Frage Ihnen nicht viel geholfen hat, find ... -print0
sollte – wie bereits vorgeschlagen – Folgendes helfen.
Antwort4
Verwenden pwd
durch Finden:
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open