Der Unterschied besteht darin, welche Daten das Zielprogramm akzeptiert.
Wenn Sie nur eine Pipe verwenden, werden Daten in STDIN (dem Standardeingabestream) als unformatierter Datenstapel empfangen, der zeilenweise sortiert werden kann. Einige Programme akzeptieren ihre Befehle jedoch nicht in der Standardeinstellung, sondern erwarten, dass sie in den Argumenten des Befehls angegeben werden. Zum Beispiel touch
nimmt einen Dateinamen als Parameter in der Befehlszeile wie folgt: touch file1.txt
.
Wenn Sie ein Programm haben , die Dateinamen ausgibt , auf Standard aus und sie verwenden möchten als Argumente zu touch
, müssen Sie verwenden , xargs
welche die STDIN - Stream - Daten liest und konvertiert jede Zeile in den Raum getrennt Argumente für den Befehl.
Diese beiden Dinge sind äquivalent:
# touch file1.txt
# echo file1.txt | xargs touch
Verwenden xargs
Sie es nur, wenn Sie genau wissen, was es tut und warum es benötigt wird. Oft gibt es einen besseren Weg, als xargs
die Konvertierung zu erzwingen. Der Konvertierungsprozess ist auch mit potenziellen Fallstricken wie Flucht und Worterweiterung usw. behaftet.
xargs
und$(...)
) ist xargs weitaus sicherer als das Ersetzen von Befehlen. Und ich kann mich nicht erinnern, jemals auf einen legitimen Dateinamen mit einer neuen Zeile gestoßen zu sein. Sind die Probleme mit der Ersetzung von Befehlen und der Erweiterung von Wörtern nicht gleichbedeutend mit Problemen mit der Ersetzung von Befehlen und nicht mit Xargs?xargs -0
) aufteilen , was in Verbindung mit nützlich istfind -print0
.xargs
das Programm über die Shell mit durch Leerzeichen getrennten Argumenten auf oder erstellt es die Argumentliste tatsächlich intern (z. B. zur Verwendung mitexecv
/execp
)?-d \n
, obwohl BSD xargs (OSX et al.) Diese Option anscheinend nicht unterstützt.Um die bereits gegebenen Antworten zu erweitern,
xargs
können Sie eine coole Sache tun, die in der heutigen Multicore- und verteilten Computerlandschaft immer wichtiger wird: Sie können Jobs parallel verarbeiten.Zum Beispiel:
codiert * .wav => * .flac mit drei Prozessen gleichzeitig (
-P 3
).quelle
-exec
Parameter verarbeitet Jobs nicht parallel.-0
Argument toxargs
bewirkt, dass dasNULL
Zeichen als Begrenzer für das Eingabeelement betrachtet wird.find -print0
NULL-getrennte Elemente ausgeben. Dies ist eine gute Vorgehensweise für Dateinamen, die Leerzeichen, Anführungszeichen oder andere Sonderzeichen enthalten können.xargs ist besonders nützlich, wenn Sie eine Liste von Dateipfaden auf stdin haben und damit etwas anfangen möchten. Zum Beispiel:
Lassen Sie uns dies Schritt für Schritt untersuchen:
Mit anderen Worten, unsere Eingabe ist eine Liste von Pfaden, mit denen wir etwas tun möchten.
Um herauszufinden, was xargs mit diesen Pfaden macht, ist es ein netter Trick,
echo
vor Ihrem Befehl Folgendes hinzuzufügen :Das
-n 1
Argument lässt xargs jede Zeile in einen eigenen Befehl umwandeln. Dersed -i "s/color/colour/g"
Befehl ersetzt alle Vorkommen voncolor
mitcolour
für die angegebene Datei.Beachten Sie, dass dies nur funktioniert, wenn Ihre Pfade keine Leerzeichen enthalten. In diesem Fall sollten Sie nullterminierte Pfade als Eingabe für xargs verwenden, indem Sie das
-0
Flag übergeben. Eine Beispielverwendung wäre:Das funktioniert genauso wie oben beschrieben, funktioniert aber auch, wenn einer der Pfade ein Leerzeichen enthält.
Dies funktioniert mit jedem Befehl, der Dateinamen als Ausgabe erzeugt, wie z. B.
find
oderlocate
. Wenn Sie es jedoch in einem Git-Repository mit vielen Dateien verwenden, ist es möglicherweise effizienter, esgit grep -l
stattgit ls-files
wie folgt zu verwenden:Der
git grep -l "color" "*.tex"
Befehl gibt eine Liste von "* .tex" -Dateien aus, die den Ausdruck "Farbe" enthalten.quelle
Ihr erstes Argument verdeutlicht den Unterschied recht gut.
\ls | grep Cases | less
Ermöglicht das Durchsuchen der Liste der vonls
und erstellten Dateinamengrep
. Es spielt keine Rolle, dass es sich zufällig um Dateinamen handelt, sondern nur um Text.\ls | grep Cases | xargs less
Ermöglicht das Durchsuchen der Dateien, deren Namen vom ersten Teil des Befehls erzeugt werden.xargs
Verwendet eine Liste von Dateinamen als Eingabe und einen Befehl in der Befehlszeile und führt den Befehl mit den Dateinamen in der Befehlszeile aus.Bei der Verwendung unter Berücksichtigung
xargs
, bedenken Sie, dass es Eingang erwartet auf eine seltsame Weise formatiert: Leerzeichen getrennte, mit\
,'
und"
verwendet für die Quotierung (auf ungewöhnliche Art und Weise, weil\
keine besondere in Anführungszeichen ist). Verwendenxargs
Sie nur, wenn Ihre Dateinamen keine Leerzeichen oder\'"
.quelle
xargs
hat die-0, --null
Möglichkeit, das Leerzeichenproblem zu umgehen (das habe ich höchstwahrscheinlich von Ihnen erfahren :).xarg
Ich gehe also davon aus, dass Sie sich auf einen No-Options- Aufruf beziehen, bin aber verwirrt, wenn Sie auf die Anführungszeichen verweisen. Haben Sie einen Link oder ein Beispiel dazu? .. (ps.| xargs less
ist ein praktischer "Trick" +1 .. danke ..In Ihrem Beispiel müssen Sie überhaupt nicht verwenden,
xargs
dafind
genau und sicher das getan wird, was Sie tun möchten.Genau das, was Sie verwenden möchten,
find
ist:In diesem Beispiel
-maxdepth 1
bedeutet dies, dass nur im aktuellen Verzeichnis gesucht wird und keine Unterverzeichnisse erstellt werden. Standardmäßig sucht find in allen Unterverzeichnissen (was häufig gewünscht wird), sofern Sie es nicht mit maxdepth einschränken. Das{}
ist der Name der Datei, die an ihrer Stelle ersetzt wird, und das+
ist eine von zwei Befehlsende-Markierungen, die andere;
. Der Unterschied zwischen ihnen besteht darin, dass;
der Befehl für jede Datei+
einzeln ausgeführt wird , während der Befehl für alle Dateien gleichzeitig ausgeführt wird. Beachten Sie jedoch, dass Ihre Shell wahrscheinlich versucht, sich;
selbst zu interpretieren. Sie müssen sie daher entweder mit\;
oder schließen';'
. Ja,find
hat eine Reihe von kleinen Ärgernissen wie diese, aber seine Kraft macht das mehr als wett.Beides
find
undxargs
sind zunächst schwierig zu lernen. Damit Sie lernen ,xargs
versuchen , die Verwendung-p
oder--interactive
Option , die Ihnen den Befehl zeigt es im Begriff ist , auszuführen und fordern SieFormal auf, ob Sie es ausgeführt werden sollen.In ähnlicher Weise
find
können Sie-ok
anstelle von verwenden-exec
, um Sie aufzufordern, ob Sie den Befehl ausführen möchten oder nicht.Es kann jedoch vorkommen, dass Sie
find
nicht in der Lage sind, alles zu tun, was Sie möchten, und hierxargs
kommt es an. Der-exec
Befehl akzeptiert nur eine Instanz des{}
Auftretens. Wenn Sie also einen Fehler erhaltenfind -type f -exec cp {} {}.bak \;
, können Sie dies stattdessen so tun :find -type f -print0 | xargs -0 -l1 -IX cp X X.bak
Weitere Informationen zu Run Commands finden Sie im GNU Findutils-Handbuch .
Ich erwähnte auch, dass dies
find
sicher das macht, was Sie wollen, da Sie beim Umgang mit Dateien auf Leerzeichen und andere Zeichen stoßen, die Probleme verursachen,xargs
wenn Sie nicht die Option-0
oder--null
zusammen mit etwas verwenden, das stattdessen Eingabeelemente erzeugt, die mit einem Null-Zeichen abgeschlossen sind Leerzeichen.quelle
'
oder"
können problematisch sein, wohingegenfind
diese Fälle problemlos behandelt werden.xargs
(zusammen mitfind
,sort
,du
,uniq
,perl
und ein paar andere) akzeptiert eine Befehlszeilenoption zu sagen : „STDIN eine Liste von Dateien hat, getrennt durch eine NUL (0x00) Byte“. Dies erleichtert den Umgang mit Dateinamen mit Leerzeichen und anderen lustigen Zeichen. Dateinamen enthalten keine NULs.quelle