xargs -I Option

12

Das xargs-Handbuch sagt:

-I replace-str
--replace [= replace-str]
-i [replace-str]
Ersetzen Sie das Auftreten von replace-str in den Anfangsargumenten durch Namen, die aus der Standardeingabe gelesen wurden.

Ich verstehe diesen Teil nicht: with names read from standard input.

Zum Beispiel, was passiert mit:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

Der obige Code zählt die Gesamtzahl der Dateien / Verzeichnisse in einem Verzeichnis.

Könnte mir das jemand erklären?

sjsam
quelle

Antworten:

20

"mit Namen, die aus der Standardeingabe gelesen wurden" bedeutet, dass xargsdie in der Standardeingabe eingehenden Daten übernommen, aufgeteilt und zum Ausführen des in den Argumenten angegebenen Befehls verwendet werden. Standardmäßig wird es in Leerzeichen oder Zeilenumbrüche aufgeteilt und echomit so vielen Argumenten wie möglich gleichzeitig ausgeführt.

Die -0Option in Ihrem Beispiel weist xargsan, die Eingabe auf Null-Bytes anstelle von Leerzeichen oder Zeilenumbrüchen aufzuteilen. In Kombination mit find's' -print0können Dateinamen, die Leerzeichen oder Zeilenumbrüche enthalten, ordnungsgemäß behandelt werden.

Die -IOption ändert die Art und Weise, wie die neuen Befehlszeilen erstellt werden. Anstatt so viele Argumente wie möglich gleichzeitig hinzuzufügen, xargsnehmen Sie jeweils einen Namen aus der Eingabe, suchen Sie nach dem angegebenen Token ( {}hier) und ersetzen Sie diesen durch den Namen.

In Ihrem Beispiel {}ist es nicht in der Befehlsvorlage enthalten, die an übergeben xargswurde. Daher xargswird es angewiesen echo, für jeden Dateinamen, der von angegeben wird, einmal ohne Argument auszuführen find. Um dies zu sehen, lassen Sie Folgendes fallen wc:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

Sie sehen eine Reihe von Leerzeilen ... Vergleichen Sie dies mit

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

und

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

und

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

um ein besseres Verständnis zu bekommen.

Stephen Kitt
quelle