Multi-Thread-Xargs mit Beispielen

Multi-Thread-Xargs mit Beispielen

Wenn Sie neu sind Xargs, oder nicht wissen was Xargs Lesen Sie noch unsere Xargs für Anfänger zuerst mit Beispielen. Wenn Sie schon etwas gewohnt sind Xargs, und kann grundlegend schreiben Xargs Befehlszeilenanweisungen ohne das Handbuch zu betrachten, dann hilft Ihnen dieser Artikel, sich weiterentwickeln zu lassen Xargs In der Befehlszeile, insbesondere durch Multi-Threaded.

In diesem Tutorial lernen Sie:

  • Wie benutzt man Xargs -P (Multi-Thread-Modus) aus der Befehlszeile in Bash
  • Beispiele für erweiterte Nutzung mit Multi-Threaded Xargs Aus der Befehlszeile in Bash
  • Ein tieferes Verständnis dafür, wie man sich anwendet Xargs Multi-Threaded zu Ihrem vorhandenen Bash-Code
Multi-Thread-Xargs mit Beispielen

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Linux-Verteilungsunabhängige
Software BASH -Befehlszeile, Linux -basiertes System
Andere Der Xargs Das Dienstprogramm ist standardmäßig in der Bash -Shell enthalten
Konventionen # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl
$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden

Beispiel 1: Aufrufen einer weiteren Bash -Shell mit Xargs Compiled -Eingang



Nach dem Lernen nutzt man Xargs, er oder sie wird das bald finden - während Xargs ermöglicht es einem, viele mächtige Dinge für sich selbst zu tun - die Kraft von Xargs Scheint durch die Unfähigkeit, mehrere Befehle nacheinander auszuführen, begrenzt zu sein.

Nehmen wir zum Beispiel an, wir haben ein Verzeichnis, das Unterverzeichnisse benannt hat 00 Zu 10 (Insgesamt 11). Und für jedes dieser Unterverzeichnisse möchten wir uns hineinversetzen und überprüfen, ob eine Datei namens genannt wird Datei.txt existiert, und wenn ja Katze (und verschmelzen mit Verwendung >>) Der Inhalt dieser Datei zu einer Datei Total_file.txt im Verzeichnis wo das 00 Zu 10 Verzeichnisse sind. Versuchen wir dies mit Xargs In verschiedenen Schritten:

$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ LS 00 01 02 03 04 05 06 07 09 10 $ Echo 'A'> 03/Datei.txt $ echo 'b'> 07/Datei.txt $ echo 'c'> 10/Datei.txt 

Hier erstellen wir zuerst 11 Verzeichnisse, 00 Zu 10 und als nächstes erstellen 3 Probe Datei.txt Dateien in den Unterverzeichnissen 03, 07 Und 10.

$ find . -Maxdepth 2 -Typ F -NAME -Datei.txt ./10/Datei.txt ./07/Datei.txt ./03/Datei.txt 

Wir schreiben dann a finden Befehl, alle zu lokalisieren Datei.txt Dateien beginnend im aktuellen Verzeichnis (.) und das bis zu maximal 1 Subdirektorienstufe:

$ find . -Maxdepth 2 -Typ F -NAME -Datei.txt | xargs -i  cat > ./Total_file.txt $ cat Total_file.txt c b a 

Der -Maxdepth 2 zeigt an das aktuelle Verzeichnis (1) und Alle Unterverzeichnisse dieses Verzeichnisses (daher die maximale Tiefe von 2).

Endlich benutzen wir Xargs (mit dem empfohlenen und bevorzugten Ersatz Zeichenfolge, wie an die XARGs übergeben -ICH Zeichenfolge ersetzen Option) den Inhalt einer solchen Datei, die sich von der befindet finden Befehl in eine Datei im aktuellen Verzeichnis benannt Total_file.txt.

Etwas Schönes hier ist das, obwohl man darüber nachdenken würde Xargs als anschließend ausführende Multiple Katze Befehle, die alle in dieselbe Datei umleiten, kann man verwenden > (Ausgabe in eine neue Datei, erstellen Sie die Datei, wenn sie noch nicht vorhanden ist, und überschreiben Sie eine Datei mit demselben Namen, die bereits dort sind) anstatt >> (An eine Datei anhängen und die Datei erstellen, wenn sie noch nicht vorhanden ist)!



Die Übung bisher Art von erfüllte unsere Anforderungen, aber es stimmte nicht genau mit der Anforderung überein - nämlich nicht in die Unterverzeichnisse durchlaufen. Es benutzte auch nicht die >> Umleitung wie angegeben, obwohl es in diesem Fall noch funktioniert hätte.

Die Herausforderung beim Ausführen mehrerer Befehle (wie die spezifischen CD Befehl erforderlich, um das Verzeichnis/die Überfahrung in das Unterverzeichnis) von innen zu ändern Xargs ist das 1) sie sind sehr schwer zu codieren und 2) es ist möglicherweise nicht möglich, dies überhaupt zu codieren.

Es gibt jedoch eine andere und leicht verständliche Möglichkeit, dies zu codieren, und wenn Sie wissen, wie es geht, werden Sie dies wahrscheinlich in zahlreicher Verwendung verwenden. Lassen Sie uns eintauchen.

$ rm Total_file.txt 

Wir haben zuerst unsere vorherige Ausgabe aufgeräumt.

$ ls -d-color = nie [0-9] [0-9] | xargs -i  echo 'cd ; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; Fi 'CD 00; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 01; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 02; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 03; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 04; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 05; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 06; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 07; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 08; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 09; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; FI CD 10; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; fi 

Als nächstes formulierten wir einen Befehl, diesmal mithilfe der Verwendung ls die alle Verzeichnisse auflisten, die dem entsprechen [0-9] [0-9] Regelmäßiger Ausdruck (lesen Sie unseren Advanced Bash Regex mit Beispielen für weitere Informationen zu regulären Ausdrücken).

Wir haben auch benutzt Xargs, aber diesmal (im Vergleich zu früheren Beispielen) mit einem Echo Befehl, der genau das ausgibt, was wir tun möchten, auch wenn es mehr benötigt, als ein oder viele Befehle. Denken Sie darüber nach einem Mini-Skript.

Wir benützen auch CD in Verzeichnisse zu verwandeln, wie von der aufgeführt ls -d (Nur Verzeichnisse) Befehl (der als Randnotiz durch die geschützt ist --Farbe = nie Klausel, die Farbcodes in der verhindern ls Ausgabe aus dem Schießen unserer Ergebnisse) und prüfen Sie, ob die Datei die Datei Datei.txt Gibt es in der Unterverzeichnis, indem sie eine verwenden Wenn [-r… Befehl. Wenn es existiert, wir Katze Die Datei.txt hinein … /Total_file.txt. Beachten Sie das als die CD im Befehl hat uns in das Unterverzeichnis gebracht!

Wir führen dies aus, um zu sehen, wie es funktioniert (schließlich nur die Echo wird ausgeführt; Nichts wird tatsächlich passieren). Der generierte Code sieht toll aus. Lassen Sie uns jetzt noch einen Schritt weiter gehen und tatsächlich dasselbe ausführen:

$ ls -d-color = nie [0-9] [0-9] | xargs -i  echo 'cd ; Wenn [-r ./Datei.txt ]; dann Katzendatei.txt >>… /Total_file.txt; fi '| xargs -i  bash -c "" $ cat Total_file.txt a b c 


Wir haben jetzt das Gesamtskript ausgeführt, indem wir ein bestimmtes (und immer das gleiche, ich verwenden.e. Sie werden feststellen, dass Sie schreiben | xargs -i bash -c "" mit einigen Regelmäßigkeitsbefehl, der alles ausführt, was von der generiert wurde Echo vorausgehen: xargs -i bash -c "". Grundsätzlich fordert dies dem Bash -Interpreter an. Sehr kraftvoll!

Beispiel 2: Multi-Thread-Xargs

Hier werden wir uns zwei verschiedene ansehen Xargs Befehle, die ohne parallele (multi-thread) ausgeführt werden, der andere mit. Betrachten Sie den Unterschied zwischen den folgenden zwei Beispielen:

$ Zeit für i in $ (SEQ 1 5); Echo $ [$ Random % 5 + 1]; fertig | xargs -i  echo "schlaf ; echo 'erledigt!  '"| xargs -i  bash -c"  "erledigt! 5 fertig! 5 fertig! 2 fertig! 4 fertig! 1 real 0m17.016S Benutzer 0m0.017S SYS 0M0.003s 
$ Zeit für i in $ (SEQ 1 5); Echo $ [$ Random % 5 + 1]; fertig | xargs -i  echo "schlaf ; echo 'erledigt!  '"| xargs -p5 -i  bash -c"  "erledigt! 1 fertig! 3 fertig! 3 fertig! 3 fertig! 5 real 0m5.019s Benutzer 0m0.036S SYS 0M0.015s 

Der Unterschied zwischen den tatsächlichen zwei Befehlszeilen ist klein; Wir haben nur hinzugefügt -P5 in der zweiten Befehlszeile. Die Laufzeit jedoch (gemessen von der Zeit Befehlspräfix) ist signifikant. Lassen Sie uns herausfinden, warum (und warum sich die Ausgabe unterscheidet!).



Im ersten Beispiel erstellen wir a für Schleife, die 5 -mal dauert (aufgrund der Unterschale $ (SEQ 1 5) Zahlen erzeugen von 1 Zu 5) und darin wiedergeben wir eine zufällige Zahl zwischen 1 und 5. Als nächstes haben wir diese Ausgabe in den Schlafbefehl gesendet und auch die SLEPT der Dauer als Teil des Fertiges ausgegeben! Echo. Schließlich haben wir dies gesendet, um von einem Subshell -Bash -Befehl betrieben zu werden, wieder auf ähnliche Weise wie unser letztes Beispiel.

Die Ausgabe des ersten Befehls funktioniert wie diesen; Führen Sie einen Schlaf aus, Ausgabeergebnis, führen Sie den nächsten Schlaf aus und so weiter.

Der zweite Befehl ändert dies jedoch vollständig. Hier haben wir hinzugefügt -P5 was im Grunde genommen 5 parallele Fäden auf einmal beginnt!

Die Art und Weise, wie dieser Befehl funktioniert, ist: Starten Sie bis X -Threads (wie durch die Option -P definiert) und verarbeiten Sie sie gleichzeitig. Wenn ein Thread abgeschlossen ist, holen Sie sich sofort neue Eingaben und warten Sie nicht, bis andere Themen zuerst fertig sind. Der letztere Teil dieser Beschreibung ist hier nicht anwendbar (es wäre nur dann, wenn weniger Threads von nachgewiesen wären -P Dann wäre die Anzahl der angegebenen "Zeilen" der Eingabe oder mit anderen Worten weniger parallele Threads verfügbar, dann die Anzahl der Zeilen der Eingabe).

Das Ergebnis ist, dass die Fäden, die zuerst fertig sind - diejenigen mit einer kurzen zufälligen Schlafzeit - zuerst zurückkommen und ihre 'Fertig ausgeben!' Stellungnahme. Die Gesamtlaufzeit fällt auch von etwa 17 Sekunden auf nur etwa 5 Sekunden genau in der realen Uhrzeit zurück. Cool!

Abschluss

Verwendung Xargs ist eine der fortschrittlichsten und auch eine der leistungsstärksten Möglichkeiten, in Bash zu codieren. Aber es hört nicht auf, nur zu benutzen Xargs! In diesem Artikel haben wir so eine multi-thread-parallele Ausführung über die untersucht -P Option zu Xargs. Wir haben uns auch angesehen, um Unterschalen mit dem Rufen zu verwenden $ () und schließlich haben wir eine Methode eingeführt, um Multi-Command-Aussagen direkt an zu verabschieden Xargs durch Verwendung a bash -c Subshell -Anruf.

Kraftvoll? Wir denken das! Lass uns deine Gedanken.

Verwandte Linux -Tutorials:

  • Beispiele für die Verwendung des XARGS -Befehls unter Linux
  • Multi-Thread-Bash-Skript- und Prozessmanagement bei der…
  • Xargs für Anfänger mit Beispielen
  • Mastering -Bash -Skriptschleifen beherrschen
  • So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen
  • Grundlegende Linux -Befehle
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Linux -Befehle: Top 20 wichtigste Befehle, die Sie benötigen, um…
  • Hung Linux System? Wie man zur Befehlszeile entkommt und…
  • Dinge zu installieren auf Ubuntu 20.04