Detailliertes Tutorial zur Verwendung des Befehls xargs unter Linux

Detailliertes Tutorial zur Verwendung des Befehls xargs unter Linux

Hallo zusammen, ich bin Liang Xu.

Sind Sie bei der Verwendung von Linux schon einmal in die Situation geraten, dass Sie einige Befehle aneinanderreihen mussten, einer der Befehle jedoch keine Pipe-Eingabe akzeptierte? In diesem Fall können wir den Befehl xargs verwenden. xargs kann die Ausgabe eines Befehls als Argument an einen anderen Befehl senden.

Unter Linux sind allen Standardanwendungen drei Datenströme zugeordnet. Dies sind der Standardeingabestrom (stdin), der Standardausgabestrom (stdout) und der Standardfehlerstrom (stderr). Diese Streams arbeiten über Text. Wir verwenden Text, um Eingaben (stdin) an den Befehl zu senden, und die Antwort (stdout) wird im Terminalfenster als Text angezeigt. Fehlermeldungen werden auch als Text im Terminalfenster (stderr) angezeigt.

Eine der großartigen Funktionen von Linux und Unix-ähnlichen Betriebssystemen ist die Möglichkeit, den Standardausgabestream eines Befehls an den Standardeingabestream eines anderen Befehls weiterzuleiten. Dem ersten Befehl ist es egal, ob seine Ausgabe in das Terminalfenster geschrieben wird, und dem zweiten Befehl ist es egal, ob seine Eingabe über die Tastatur erfolgt.

Obwohl alle Linux-Befehle über drei Standardstreams verfügen, akzeptieren nicht alle Befehle die Standardausgabe eines anderen Befehls als Eingabe für ihren Standardeingabestream. Daher können wir die Eingabe nicht an diese Befehle weiterleiten.

xargs ist ein Befehl, der Ausführungspipelines mithilfe von Standarddatenströmen erstellt. Durch die Verwendung des Befehls xargs können wir Befehle wie echo , rm und mkdir dazu bringen, die Standardeingabe als Argumente zu akzeptieren.

Befehl „xargs“

xargs akzeptiert Eingaben aus einer Pipe oder einer Datei. xargs verwendet diese Eingabe als Argumente für den von uns angegebenen Befehl. Wenn wir xargs keinen bestimmten Befehl angeben, wird standardmäßig echo verwendet. xargs erzeugt immer eine einzelne Ausgabezeile, auch wenn die Eingabedaten mehrzeilig sind.

Wenn wir die Option -1 (eine Datei pro Zeile auflisten) von ls verwenden, erhalten wir eine Liste mit Dateinamen:

$ ls -1 ./*.sh

Dieser Befehl listet die Shell-Skriptdateien im aktuellen Verzeichnis auf.

Was passiert, wenn wir die Ausgabe an xargs weiterleiten?

$ ls -1 ./*.sh | 

Wie Sie sehen, wird die Ausgabe als lange Textzeichenfolge in das Terminal geschrieben. Daraus können wir ersehen, dass xargs Ausgaben als Argumente an andere Befehle übergeben kann.

Verwenden von xargs mit dem WC-Befehl

Wir können den Befehl wc ganz einfach die Anzahl der Wörter, Zeichen und Zeilen in mehreren Dateien mit dem Befehl xargs zählen lassen

$ ls *.c |

Die Ausführungsergebnisse sind wie folgt:

Die Befehlsergebnisse zeigen die Statistiken für jede Datei sowie die Gesamtsumme.

Dieser Befehl führt die folgenden Vorgänge aus:

ls listet alle .page-Dateien auf und übergibt diese Liste an xargs . xargs übergibt alle Dateinamen an wc . wc verarbeitet diese Dateinamen als Befehlszeilenargumente.

Verwenden von xargs mit einer Bestätigungsnachricht

Wir können die Option -p (interaktiv) verwenden, damit xargs uns fragt, ob wir fortfahren möchten.

Wenn wir dem touch -Befehl über xargs eine Zeichenfolge mit Dateinamen übergeben, erstellt touch diese Dateien.

$ echo 'eins zwei drei' | xargs -p touch 

Das Terminal zeigt den auszuführenden Befehl an und xargs wartet darauf, dass wir y oder Y , n oder N eingeben und zum Antworten die Eingabetaste drücken. Wenn nur Enter gedrückt wird, wird dies als n behandelt. Dieser Befehl wird nur ausgeführt, wenn wir y oder Y eingeben.

Wir drücken y und Enter und prüfen anschließend mit ls , ob die Datei erstellt wurde.

$ ls eins zwei drei 

Verwenden von xargs mit mehreren Befehlen

Wir können xargs mit mehreren Befehlen verwenden, indem wir -I (Anfangsargument) verwenden. Diese Option definiert替換字符串. Überall, wo die Ersetzungszeichenfolge in der Befehlszeile erscheint, wird der Wert eingefügt, den wir an xargs übergeben haben.

Das ist etwas abstrakt, also erklären wir es anhand eines Beispiels.

Verwenden wir zunächst den Befehl tree , um die Unterverzeichnisse im aktuellen Verzeichnis anzuzeigen. Die Option -d (Verzeichnis) bewirkt, dass tree -Befehl Dateien ignoriert und nur Verzeichnisse ausgibt.

$ Baum -d 

Jetzt gibt es nur noch ein Unterverzeichnis „Images“.

In der Datei directors.txt haben wir die Namen einiger Verzeichnisse, die wir erstellen möchten. Lassen Sie uns zunächst cat verwenden, um den Inhalt anzuzeigen.

$ cat-Verzeichnisse.txt 

Diesen Inhalt übergeben wir als Eingabedaten an xargs und führen folgenden Befehl aus:

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

Dieser Befehl führt die folgenden Vorgänge aus:

cat directories.txt: Übergeben Sie den Inhalt der Datei directories.txt (alle Namen der zu erstellenden Verzeichnisse) an xargs . xargs -I % : definiert die Ersetzungszeichenfolge % . sh -c: Startet eine neue Subshell. -c (commond) bewirkt, dass die Shell Befehle liest. „echo %; mkdir %“: Jedes „ wird durch den von xargs übergebenen Verzeichnisnamen ersetzt. Der Befehl echo druckt den Verzeichnisnamen und mkdir erstellt das Verzeichnis.

Ergebnisse der Befehlsausführung:

Mit tree können wir überprüfen, ob das Verzeichnis erstellt wurde.

$ Baum -d 

Dateien an mehrere Speicherorte kopieren

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

Leiten Sie zunächst die Namen der beiden Verzeichnisse an xargs weiter. und lassen Sie xargs jeweils nur eines der Argumente an den verwendeten Befehl übergeben.

Um cp zweimal aufzurufen, jedes Mal mit einem der beiden Verzeichnisse als Befehlszeilenargument, können wir dies tun, indem wir -n (maximale Zahl) von xargs auf 1 setzen.

Wir verwenden hier auch die Option -v (ausführlich), damit cp Feedback zu seinen Aktivitäten liefert.

$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c

Wir haben die Dateien in zwei Verzeichnisse kopiert, jeweils ein Verzeichnis nach dem anderen. cp gibt detaillierte Informationen zurück, sodass wir sehen können, welche Vorgänge ausgeführt wurden.

Löschen von Dateien in verschachtelten Verzeichnissen

Wenn die Dateinamen Leerzeichen oder andere Sonderzeichen (wie etwa Zeilenumbrüche) enthalten, kann xargs die Dateinamen nicht richtig interpretieren. Wir können dies beheben, indem wir die Option -0 (Nullterminator) verwenden. In diesem Fall verwendet xargs das null als letztes Trennzeichen für den Dateinamen.

Hier nehmen wir den find -Befehl als Beispiel. find verfügt über eine eigene Option zum Verarbeiten von Leerzeichen und Sonderzeichen in Dateinamen, die Option -print0 (vollständiger Name, Nullzeichen).

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

Dieser Befehl führt die folgenden Aktionen aus:

find . -name „*.png“: find durchsucht das aktuelle Verzeichnis nach Objekten, deren Namen mit *.png übereinstimmen. type -f gibt an, dass nur nach Dateien gesucht werden soll. -print0: Der Name wird mit null beendet, Leerzeichen und Sonderzeichen bleiben erhalten. xargs -0: xargs betrachtet Dateinamen auch als nullterminiert und Leerzeichen und Sonderzeichen verursachen keine Probleme. rm -v -rf "{}": rm gibt Feedback zum laufenden Vorgang ( -v ), führt die Operation rekursiv aus (-r) und löscht die Datei direkt, ohne eine Fehlermeldung zu senden ( -f ). Ersetzen Sie "{}" durch jeden Dateinamen.

Nach Ausführung des Befehls werden alle Unterverzeichnisse durchsucht und die passenden Dateien gelöscht.

Löschen verschachtelter Verzeichnisse

Angenommen, wir möchten eine Reihe verschachtelter Unterverzeichnisse löschen. Verwenden Sie zunächst tree , um sie anzuzeigen.

$ Baum -d 

$ finde . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}"

Dieser Befehl verwendet find, um das aktuelle Verzeichnis rekursiv nach einem Verzeichnis namens level_one zu durchsuchen und übergibt dann den Verzeichnisnamen via xargs an rm .

Der Unterschied zwischen diesem Befehl und dem vorherigen besteht darin, dass das durchsuchte Element der Name des obersten Verzeichnisses ist und -type d angibt, dass das Verzeichnis und nicht die Datei durchsucht werden soll.

Der Name jedes Verzeichnisses wird beim Entfernen ausgedruckt. Wir können den Effekt mithilfe von tree noch einmal betrachten:

$ Baum -d 

Alle verschachtelten Unterverzeichnisse wurden gelöscht.

Löschen Sie alle Dateien außer einem Dateityp

Wir können find , xargs und rm verwenden, um alle Dateitypen zu entfernen und nur den Dateityp zu behalten, den wir behalten möchten. Dazu müssen Sie den Dateityp angeben, den Sie behalten möchten.

Die Option -not bewirkt, find alle Dateinamen zurückgibt, die nicht dem Suchmuster entsprechen. Wir verwenden erneut die Option -I (Initialisierungsargument) von xargs . Die diesmal definierte Ersetzungszeichenfolge ist {} . Dies hat denselben Effekt wie die Ersetzungszeichenfolge % , die wir zuvor verwendet haben.

$ finde . -Typ f -nicht -name "*.sh" -print0 | xargs -0 -I {} rm -v {} 

Nachdem der Befehl ausgeführt wurde, bestätigen wir das Ergebnis über ls . Wie Sie sehen, verbleiben nur Dateien mit der Übereinstimmung *.sh im Verzeichnis.

$ ls -l 

Erstellen komprimierter Dateien mit Xargs

Wir können den Befehl find verwenden, um nach Dateien zu suchen und die Dateinamen über xargs an den Befehl tar zu übergeben, um eine komprimierte Datei zu erstellen.

Wir suchen im aktuellen Verzeichnis nach * .sh Dateien.

$ finde ./ -name "*.sh" -Typ f -print0 | xargs -0 tar -cvzf script_files.tar.gz

Das Ergebnis der Befehlsausführung listet alle .sh-Dateien auf und erstellt eine komprimierte Datei.

Zusammenfassen

Dies ist das Ende dieses Artikels zur Verwendung des Befehls xargs unter Linux. Weitere Informationen zur Verwendung des Befehls xargs unter Linux finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Verwendung des Linux-Befehls tr
  • Verwendung des Linux-Befehls ipcs
  • Verwendung des Linux-Befehls „sar“ und Analyse von Codebeispielen
  • Verwendung des Linux-Befehls ls
  • Verwendung des Linux-Befehls sed
  • Verwendung des Linux-Lesebefehls
  • Verwendung des Linux-Befehls usermod
  • Verwendung des Linux-Befehls passwd
  • Detaillierte Erläuterung der Verwendung des Linux-Zeitbefehls
  • Verwendung des Linux-Befehls ln
  • Verwendung des Linux-Telnet-Befehls

<<:  Zwei Möglichkeiten, Vue-Benutzer dazu zu bringen, sich über einen längeren Zeitraum ohne Bedienung von der Anmeldeseite abzumelden

>>:  Detaillierte Analyse des MySQL-Datentyps DECIMAL

Artikel empfehlen

Analysieren Sie die Verwendung und Prinzipien von Vues Bereitstellung und Injektion

Lassen Sie uns zunächst darüber sprechen, warum w...

HTML Tutorial: Sammlung häufig verwendeter HTML-Tags (4)

Diese eingeführten HTML-Tags entsprechen nicht un...

Lösung für das Problem ungültiger Breiteneinstellungen für Label und Span

Standardmäßig ist die Einstellung der Breite für B...

Popularisierung der Theorie – Benutzererfahrung

1. Konzeptanalyse 1: UE User Experience <br /&...

Detaillierte Ansicht versteckter Spalten in MySQL

Inhaltsverzeichnis 1. Primärschlüssel vorhanden 2...

JavaScript zum Erzielen eines einfachen Drag-Effekts

In diesem Artikel wird der spezifische JavaScript...

Beispiel eines Befehls zur Linux-Hardwarekonfiguration

Hardware-Ansichtsbefehle System # uname -a # Kern...

js zur Implementierung der Kollisionserkennung

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erläuterung gängiger Methoden der Vue-Entwicklung

Inhaltsverzeichnis $nächsterTick() $forceUpdate()...

Schritte zum Verpacken und Bereitstellen des Vue-Projekts auf dem Apache-Server

In der Entwicklungsumgebung wird das Vue-Projekt ...

Zusammenfassung der Shell-Methode zum Bestimmen, ob eine Variable leer ist

So ermitteln Sie, ob eine Variable in der Shell l...