Duh was? findfindet nur Dateinamen , nicht Inhalt.
Hallo71
Schon mal was gehört xargs? Oder die -execprimäre in find?
Geekosaurier
Hey Mann, ich sagte, das habe ich benutzt, nicht, dass es funktioniert hat! Warum fragst du mich wohl? Außerdem war es "so etwas wie", weil ich es nie zum Laufen bringen konnte und nach dem xargs-Teil suchen musste.
Tooshel
Entschuldigung, diese Bemerkung war an @ Hello71 gerichtet. Ich gewöhne mich immer noch an die StackExchange-Etikette.
Besser : find . -type f -print0 | xargs -0 grep /dev/null foo, damit grepimmer der passende Dateiname gedruckt wird. Oder find . -type f -exec grep /dev/null {} +für Implementierungen, die POSIX.2004 eingeholt haben (was derzeit OpenBSD ausschließt).
Gilles 'SO - hör auf böse zu sein'
Ich kann immer noch nicht glauben, dass es keinen einfacheren Weg gibt, dies zu tun. Und ich habe das "grep -r" ausprobiert und es hat nicht funktioniert. Warum ist es nur GNU grep und warum ist das nicht auf mehr Systemen?
Tooshel
1
Weil traditionell grepes nicht hatte (die Idee war, dass, wenn Sie Rekursion wollten, Sie findmit verwendet haben grep) und das Hinzufügen nachträglich zu Systemen, die seit Jahren funktionieren, Dinge brechen könnte. (GNU grepverhält sich nicht ganz identisch mit zB System V. grep)
Geekosaurier
5
Es gibt auch ack, die speziell für diese Art von Aufgaben entwickelt wurde und die Unterordnersuche automatisch durchführt.
Als Alternative zu den find | xargsAntworten können Sie auch die Verwendung von ctags in Betracht ziehen, da Sie nicht nach Text, sondern speziell nach Funktionsnamen suchen.
Um dies zu tun, würden Sie ctagsgegen Ihre Quelle laufen , um eine TAGSDatei zu erstellen , und dann grepgegen die TAGSDatei, die Zeilen im folgenden Format ausspuckt:
{tagname}<Tab>{tagfile}<Tab>{tagaddress}
Wo tagnamewird der Funktionsname enthalten, tagfileist die Datei, in der es sich befindet, und tagaddresswird ein vi-Befehl sein, um zu dieser Zeile zu gelangen. (Könnte nur eine Zeilennummer sein.)
(Gibt es eine einfache Möglichkeit, mit den verschiedenen von Eclipse erstellten Indizes etwas Ähnliches zu tun oder einfach die Eclipse-Datenbank abzufragen?)
Was ist los mit grep -r(== grep --recursive)? Vermisse ich hier etwas?
(+1 ackauch - ich benutze regelmäßig beide)
edit: Ich habe einen ausgezeichneten Artikel gefunden, der die Möglichkeiten und Fallstricke beschreibt, wenn Sie nicht GNU grephier haben . Aber im Ernst, wenn Sie nicht zur GNU grepVerfügung haben, wird das Erhalten acknoch mehr empfohlen.
Ja, anscheinend hat nicht jeder die schicke Version von grep.
Tooshel
@tooshel - wusste nicht, dass die Nicht-GNU grepdiese Option nicht hat. aktualisierte meine Antwort :)
Simon
-bash: ack: Befehl nicht gefunden
tooshel
Okay, ich habe die Anweisungen zur Installation von ack gelesen. . . und ich habe es einfach in / bin geworfen, damit jeder es benutzen kann. War das eine schlechte Idee?
Tooshel
@tooshel: nur wenn du nicht willst, dass jeder es benutzen kann ...!
Simon
0
find . | xargs grep schlägt bei Dateinamen mit Leerzeichen fehl:
> echo test > "a b c"
> find . | xargs grep test
grep: ./a: No such file or directory
grep: b: No such file or directory
grep: c: No such file or directory
Beachten Sie, dass auch -print0 dieses Problem hat.
Meiner Meinung nach ist es besser, -exec grepmit find zu arbeiten, das alle Dateinamen intern behandelt und dieses Problem vermeidet:
find … -print0 | xargs -0 …kommt mit beliebigen Dateinamen zurecht. Alle POSIX.2004-kompatiblen Implementierungen von findallow find … -exec … {} +, die den Befehl mit mehreren Dateien gleichzeitig aufrufen . Ein besserer Befehl ist find . -type f -exec grep test /dev/null {} +; Das Hinzufügen von /dev/nullist so, dass grepder Dateiname konsistent gedruckt wird, wenn eine Übereinstimmung gefunden wird.
Gilles 'SO - hör auf böse zu sein'
0
Wenn Ihre Festplatten schnell sind, möchten Sie möglicherweise das grep parallelisieren:
-rin xargsvermeidet die Ausführung des Befehls, wenn keine Eingabe erfolgt ist. Es ist eine GNU-Erweiterung.
Es gibt auch agwelche speziell dafür entwickelt wurden und viel besser als ack. Es ist in den neuesten Debian / Ubuntu-Versionen im Paket silversearcher-ag verfügbar .
find
findet nur Dateinamen , nicht Inhalt.xargs
? Oder die-exec
primäre infind
?Antworten:
und in
zsh
mitsetopt extendedglob
,quelle
find . -type f -print0 | xargs -0 grep /dev/null foo
, damitgrep
immer der passende Dateiname gedruckt wird. Oderfind . -type f -exec grep /dev/null {} +
für Implementierungen, die POSIX.2004 eingeholt haben (was derzeit OpenBSD ausschließt).grep
es nicht hatte (die Idee war, dass, wenn Sie Rekursion wollten, Siefind
mit verwendet habengrep
) und das Hinzufügen nachträglich zu Systemen, die seit Jahren funktionieren, Dinge brechen könnte. (GNUgrep
verhält sich nicht ganz identisch mit zB System V.grep
)Es gibt auch
ack
, die speziell für diese Art von Aufgaben entwickelt wurde und die Unterordnersuche automatisch durchführt.quelle
ag
was viel schneller ist alsack
.Als Alternative zu den
find | xargs
Antworten können Sie auch die Verwendung von ctags in Betracht ziehen, da Sie nicht nach Text, sondern speziell nach Funktionsnamen suchen.Um dies zu tun, würden Sie
ctags
gegen Ihre Quelle laufen , um eineTAGS
Datei zu erstellen , und danngrep
gegen dieTAGS
Datei, die Zeilen im folgenden Format ausspuckt:Wo
tagname
wird der Funktionsname enthalten,tagfile
ist die Datei, in der es sich befindet, undtagaddress
wird ein vi-Befehl sein, um zu dieser Zeile zu gelangen. (Könnte nur eine Zeilennummer sein.)(Gibt es eine einfache Möglichkeit, mit den verschiedenen von Eclipse erstellten Indizes etwas Ähnliches zu tun oder einfach die Eclipse-Datenbank abzufragen?)
quelle
Was ist los mit
grep -r
(==grep --recursive
)? Vermisse ich hier etwas?(+1
ack
auch - ich benutze regelmäßig beide)edit: Ich habe einen ausgezeichneten Artikel gefunden, der die Möglichkeiten und Fallstricke beschreibt, wenn Sie nicht
GNU grep
hier haben . Aber im Ernst, wenn Sie nicht zurGNU grep
Verfügung haben, wird das Erhaltenack
noch mehr empfohlen.quelle
grep
diese Option nicht hat. aktualisierte meine Antwort :)find . | xargs grep
schlägt bei Dateinamen mit Leerzeichen fehl:Beachten Sie, dass auch -print0 dieses Problem hat.
Meiner Meinung nach ist es besser,
-exec grep
mit find zu arbeiten, das alle Dateinamen intern behandelt und dieses Problem vermeidet:quelle
find … -print0 | xargs -0 …
kommt mit beliebigen Dateinamen zurecht. Alle POSIX.2004-kompatiblen Implementierungen vonfind
allowfind … -exec … {} +
, die den Befehl mit mehreren Dateien gleichzeitig aufrufen . Ein besserer Befehl istfind . -type f -exec grep test /dev/null {} +
; Das Hinzufügen von/dev/null
ist so, dassgrep
der Dateiname konsistent gedruckt wird, wenn eine Übereinstimmung gefunden wird.Wenn Ihre Festplatten schnell sind, möchten Sie möglicherweise das grep parallelisieren:
Sehen Sie sich das Intro-Video an, um mehr über GNU Parallel zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ
quelle
$ find -type f -print0 | xargs -r0 grep foo
-r
inxargs
vermeidet die Ausführung des Befehls, wenn keine Eingabe erfolgt ist. Es ist eine GNU-Erweiterung.Es gibt auch
ag
welche speziell dafür entwickelt wurden und viel besser alsack
. Es ist in den neuesten Debian / Ubuntu-Versionen im Paket silversearcher-ag verfügbar .quelle