
Ich kenne einen Befehl, den ich ziemlich oft verwende, wenn ich an der Codebasis von jemand anderem arbeite. Hier ist ein Beispiel
find ./ -name "*.php" | xargs grep "my_awesome_function("
Ich habe bereits die Dokumentation zu jedem der Befehle hier durchgelesen, wie find
, und von
pipe
xargs
grep
http://www.computerhope.com/unix.htm
Ich verstehe jedoch immer noch nicht ganz, wie dieser Befehl nach allen PHP-Dateien vom aktuellen Verzeichnis abwärts sucht und dann herausfindet, welche davon die Zeichenfolge „my_awesome_function(“ enthalten. Ich verstehe, wie der Teil vor der Pipe funktioniert, aber nach der Pipe ist mein Verständnis dahin. Ich verstehe, dass jede Datei wie ein Argument an den Grep-Befehl gesendet wird. Kann mir jemand erklären, was hier passiert?
Antwort1
find
Versuchen Sie, den Befehl ohne den letzten Teil auszuführen :
find ./ -name "*.php"
Sie sehen eine Liste von Dateinamen, die alle mit enden .php
.
Nun xarg
liest der Befehl alle diese Dateinamen aus der Pipe, nimmt eine Reihe davon (Sie können mit der Option festlegen, wie viele -n 2
) und ruft dann sein Argument mit diesen Namen auf. Wenn also die Ausgabe von find ist file1.php file2.php file3.php
und xarg
höchstens zwei Dateien zusammenfassen würde (oder Sie es mit erzwingen xargs -n 2
), dann würde es aufrufen
grep "my_awesome_function(" file1.php file2.php
grep "my_awesome_function(" file3.php
was wiederum Ihre Ausgabe erzeugt. Sie können sehen, was wirklich passiert, indem Sie Folgendes einfügen echo
:
find ./ -name "*.php" | xargs echo grep "my_awesome_function("
Probieren Sie auch mit der Gruppierung herum:
find ./ -name "*.php" | xargs -n 2 echo grep "my_awesome_function("