So verwenden Sie den xargs-Befehl unter Linux

Müssen Sie einige Linux-Befehle aneinanderreihen, aber einer von ihnen akzeptiert keine Pipe-Eingabe? xargs kann die Ausgabe eines Befehls übernehmen und als Parameter an einen anderen Befehl senden.

Alle Standard-Linux-Dienstprogramme haben drei Datenströme mit ihnen verbunden. Dies sind der Standardeingabestrom (stdin), der Standardausgabestrom (stdout) und der Standardfehlerstrom (stderr).

Diese Streams arbeiten mit Text. Wir senden eine Eingabe (stdin) an einen Befehl mit Text, und die Antwort (stdout) wird als Text in das Terminalfenster geschrieben. Fehlermeldungen werden auch als Text (stderr) in das Terminalfenster geschrieben.

Eine der großartigen Eigenschaften von Linux- und Unix-ähnlichen Betriebssystemen ist die Möglichkeit, die stdout-Ausgabe eines Befehls in die stdin-Eingabe eines zweiten Befehls zu leiten. Dem ersten Befehl ist es egal, dass seine Ausgabe nicht an ein Terminalfenster geht, und dem zweiten Befehl ist es egal, dass seine Eingabe nicht von einer Tastatur kommt.

Obwohl alle Linux-Befehle die drei Standardstreams haben, akzeptieren nicht alle die stdout eines anderen Befehls als Eingabe für ihre stdin. Das bedeutet, dass Sie keine Eingaben an sie weiterleiten können.

xargs ist ein Befehl zum Erstellen von Ausführungspipelines unter Verwendung der Standarddatenströme. Durch die Verwendung von xargs können wir Befehle wie echo, rm und mkdir veranlassen, Standardeingaben als Argumente zu akzeptieren.

Der xargs-Befehl

xargs akzeptiert über Pipe geleitete Eingaben. Es kann auch Eingaben aus einer Datei akzeptieren. xargs verwendet diese Eingabe als Parameter für die Befehle, mit denen es funktionieren soll. Wenn wir xargs nicht anweisen, mit einem bestimmten Befehl zu arbeiten, wird standardmäßig echo verwendet.

Wir können das verwenden, um zu demonstrieren, wie xargs immer eine einzelne Ausgabezeile generiert, selbst bei einer mehrzeiligen Eingabe.

Wenn wir die Option -1 (eine Datei pro Zeile auflisten) mit ls verwenden, erhalten wir a einzelne Spalte mit Dateinamen.

ls -1 ./*.sh

Dies listet die Shell-Skriptdateien im aktuellen Verzeichnis auf.

Wir erhalten wie erwartet eine einzelne Spalte. Wenn wir es durch xargs leiten, was bekommen wir?

ls -1 ./*.sh | xargs

Die Ausgabe wird als ein langer Textstrom in das Terminalfenster geschrieben.

Es ist diese Fähigkeit, die xargs Parameter in andere Befehle einspeisen lässt.

Verwenden von xargs mit wc

Wir können xargs verwenden, um das WC einfach zählen zu lassen Wörter, Zeichen und Zeilen in mehreren Dateien.

ls *.page | xargs wc

Das ist, was passiert:

  So zeigen Sie Datum und Uhrzeit im Linux-Terminal an (und verwenden es in Bash-Skripten)

ls listet die *.page-Dateien auf und übergibt die Liste an xargs.
xargs übergibt die Dateinamen an wc.
wc behandelt die Dateinamen so, als ob es sie als Kommandozeilenparameter erhalten hätte.

Die Statistiken für jede Datei werden zusammen mit einer Gesamtsumme angezeigt.

Verwenden von xargs mit Bestätigung

Wir können die Option -p (interaktiv) verwenden, damit xargs uns zur Bestätigung auffordert, dass wir damit einverstanden sind, fortzufahren.

Wenn wir eine Zeichenfolge von Dateinamen über xargs an touch übergeben, wird touch erstelle die Dateien für uns.

echo 'one two three' | xargs -p touch

Der auszuführende Befehl wird angezeigt und xargs wartet auf unsere Antwort, indem wir „y“ oder „Y“ oder „n“ oder „N“ eingeben und die Eingabetaste drücken.

Wenn Sie nur die Eingabetaste drücken, wird es als „n“ behandelt. Der Befehl wird nur ausgeführt, wenn Sie „y“ oder „Y“ eingeben.

Wir haben „y“ gedrückt und Enter gedrückt. Wir können ls verwenden, um zu überprüfen, ob die Dateien erstellt wurden.

ls one two three

Verwenden von xargs mit mehreren Befehlen

Wir können mehrere Befehle mit xargs verwenden, indem wir die Option -I (Anfangsargumente) verwenden.

Diese Option definiert einen „replace-string“. Überall dort, wo das Token für die Ersetzungszeichenfolge in der Befehlszeile erscheint, werden die an xargs gelieferten Werte eingefügt.

Lassen Sie uns den Befehl tree verwenden, um die Unterverzeichnisse des aktuellen Verzeichnisses anzuzeigen. Die Option -d (Verzeichnis) bewirkt, dass der Baum Dateien ignoriert und nur über Verzeichnisse berichtet.

tree -d

Es gibt ein einziges Unterverzeichnis namens „images“.

In einer Datei namens „directories.txt“ haben wir die Namen einiger Verzeichnisse, die wir erstellen möchten. Wir können uns den Inhalt mit cat ansehen.

cat directories.txt

Wir werden dies als Eingabedaten für xargs verwenden. Der Befehl, den wir ausführen werden, lautet:

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

Das gliedert sich wie folgt auf:

cat directory.txt |: Dies schiebt den Inhalt der Dateidirectrories.txt (alle neuen Verzeichnisnamen) in xargs.
xargs -I %: Definiert einen „replace-string“ mit dem Token „%“.
sh -c: Dies startet eine neue Subshell. Das -c (Befehl) weist die Shell an, Befehle von der Befehlszeile zu lesen.
‚Echo %; mkdir %‘: Jedes der „%“-Token wird durch die Verzeichnisnamen ersetzt, die von xargs übergeben werden. Der echo-Befehl gibt den Verzeichnisnamen aus; der Befehl mkdir erstellt das Verzeichnis.

  Die 8 besten Online-Tech-Support-Ressourcen für Linux-Benutzer

Die Verzeichnisse werden nacheinander aufgelistet.

Wir können Tree erneut verwenden, um zu überprüfen, ob die Verzeichnisse erstellt wurden.

tree -d

Kopieren von Dateien an mehrere Speicherorte

Wir können xargs verwenden, um Dateien mit einem einzigen Befehl an mehrere Speicherorte zu kopieren.

Wir werden die Namen von zwei Verzeichnissen als Eingabeparameter in xargs leiten. Wir weisen xargs an, nur einen dieser Parameter gleichzeitig an den Befehl zu übergeben, mit dem es arbeitet.

In diesem Fall lautet der Befehl cp. Der Effekt besteht also darin, cp zweimal aufzurufen, jedes Mal mit einem der beiden Verzeichnisse als Befehlszeilenparameter. Der Parameter xargs, der dies ermöglicht, ist die Option -n (max. Anzahl). Wir werden dies so einstellen, dass es eins ist.

Wir verwenden auch die Option -v (verbose) mit cp, damit es meldet, was passiert.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

Die Dateien werden nacheinander in die beiden Verzeichnisse kopiert. cp meldet jede Dateikopieraktion, damit wir sehen können, wie sie ausgeführt wird.

Löschen von Dateien in verschachtelten Verzeichnissen

Wenn Dateinamen Leerzeichen und seltsame Zeichen enthalten, z. B. Zeilenumbruchzeichen, kann xargs diese nicht richtig interpretieren. Wir können dieses Problem lösen, indem wir die Option -0 (null terminator) verwenden. Dies weist xargs an, das Nullzeichen als letztes Trennzeichen für Dateinamen zu verwenden.

In diesem Beispiel verwenden wir find. find hat seine eigene Option für Umgang mit Leerzeichen und seltsame Zeichen in Dateinamen. Dies ist die Option -print0 (vollständiger Name, Nullzeichen).

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

Das gliedert sich wie folgt auf:

finden . -name „*.png“: find sucht im aktuellen Verzeichnis „.“ für Objekte mit Namen, die mit „*.png“ übereinstimmen, die Dateien sind (Typ -f).
-print0: Namen werden mit einem Nullzeichen abgeschlossen, Leerzeichen und seltsame Zeichen werden berücksichtigt.
xargs -0: xargs betrachtet Dateinamen auch als nullterminiert, und Leerzeichen und seltsame Zeichen werden keine Probleme verursachen.
rm -v -rf „{}“: rm wird ausführlich sein und berichten, was passiert (-v). Es wird rekursiv (-r) sein und verschachtelte Unterverzeichnisse durchsuchen und Dateien ohne Aufforderung entfernen (-f). Das „{}“ wird durch jeden Dateinamen ersetzt.

finden .  -Name

Alle Unterverzeichnisse werden durchsucht und die Dateien, die dem Suchmuster entsprechen, werden gelöscht.

Verschachtelte Verzeichnisse entfernen

Nehmen wir an, wir möchten eine Reihe von verschachtelten Unterverzeichnissen entfernen. Baum wird uns sie sehen lassen.

tree -d

find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

Dieser Befehl verwendet find, um rekursiv im aktuellen Verzeichnis zu suchen. Das Suchziel ist ein Verzeichnis namens „level_one“. Die Verzeichnisnamen werden über xargs an rm übergeben.

  So synchronisieren Sie Ihre Dateien mit lsyncd unter Linux

finden .  -Name

Die einzigen wesentlichen Änderungen zwischen diesem Befehl und dem vorherigen Befehl sind, dass der Suchbegriff der Name des obersten Verzeichnisses ist und -type d anweist, nach Verzeichnissen und nicht nach Dateien zu suchen.

Der Name jedes Verzeichnisses wird gedruckt, wenn es entfernt wird. Wir können mit Baum überprüfen:

tree -d

Alle verschachtelten Unterverzeichnisse werden gelöscht.

Löschen aller Dateien mit Ausnahme eines Dateityps

Wir können find, xargs und rm verwenden, um alle Dateien außer einem Typ zu löschen, den wir behalten möchten. Es ist etwas kontraintuitiv, aber wir geben den Namen des Dateityps an, den wir behalten möchten, nicht den Namen derjenigen, die wir löschen möchten.

Die Option -not weist find an, die Namen der Dateien zurückzugeben, die nicht dem Suchmuster entsprechen. Wir verwenden die Option -I (initial arguments) erneut mit xargs. Dieses Mal ist das Ersetzungszeichenfolge-Token, das wir definieren, „{}“. Dies verhält sich genau so wie das zuvor generierte Token zum Ersetzen der Zeichenfolge, das zufällig ein „%“ war.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

finden .  -typ f -nicht - name

Wir können mit ls überprüfen. Die einzigen Dateien, die im Verzeichnis verbleiben, sind diejenigen, die dem Suchmuster „*.sh“ entsprechen.

ls -l

Erstellen einer Archivdatei mit Xargs

Wir können find verwenden, um nach Dateien zu suchen und sie durch xargs an tar zu übergeben, um eine Archivdatei zu erstellen.

Wir suchen im aktuellen Verzeichnis. Das Suchmuster ist „*.page“, also suchen wir nach „.page“-Dateien.

find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

finde ./ - Name

Die Dateien werden wie erwartet aufgelistet, während die Archivdatei erstellt wird.

Der Datenvermittler

Manchmal braucht man beim Stapeln ein kleines Gerüst. xargs schließt die Lücke zwischen Befehlen, die Informationen ausgeben können, und Befehlen, die nicht dafür ausgelegt sind, sie aufzunehmen.

Sowohl xargs als auch find haben eine große Anzahl von Optionen. Sie werden ermutigt, ihre Manpages zu lesen, um mehr zu erfahren.