Verwendung des Befehls xargs unter Linux

Hallo allerseits, das ist Liang Xu.

Haben Sie unter Linux jemals eine Situation erlebt, in der Sie einige Befehle aneinanderreihen müssen, aber einer der Befehle keine Pipe-Eingabe akzeptiert? In diesem Fall können wir den xargsBefehl verwenden. xargsSie können die Ausgabe eines Befehls als Parameter an einen anderen Befehl senden.

Unter Linux sind allen Standardanwendungen drei Datenströme zugeordnet. Sie sind der Standardeingabestream (stdin), der Standardeingabestream (stdout) und der Standardfehlerstrom (stderr). Diese Streams werden durch Text geleitet. Wir verwenden Text, um die Eingabe (stdin) an den Befehl zu senden, und die Antwort (stdout) wird im Terminalfenster als Text angezeigt. Fehlermeldungen werden auch im Terminalfenster (stderr) in Textform angezeigt.

Ein Hauptmerkmal von Linux- und Unix-ähnlichen Betriebssystemen ist die Möglichkeit, den Standardausgabestream eines Befehls an den Standardeingabestream eines anderen Befehls zu übergeben. Dem ersten Befehl ist es egal, ob seine Ausgabe in das Terminalfenster geschrieben wird, und dem zweiten Befehl ist es egal, ob seine Eingabe von der Tastatur kommt.

Obwohl alle Linux-Befehle drei Standard-Streams haben, akzeptieren nicht alle Befehle die Standardausgabe eines anderen Befehls als Eingabe für seinen Standardeingabestream. Daher können wir keine Eingaben über Pipes an diese Befehle übergeben.

xargsEs ist ein Befehl, der den Standarddatenfluss verwendet, um eine Ausführungspipeline zu erstellen. Durch die Verwendung von xargsBefehl können wir machen echo, rmund mkdirso auf Befehl akzeptiert die Standardeingabe als Parameter.

Befehl xargs

xargsAkzeptieren Sie Pipeline-Eingaben. Sie können auch Eingaben aus einer Datei akzeptieren. xargsVerwenden Sie diese Eingabe als Parameter des von uns angegebenen Befehls. Wenn wir keinen xargsbestimmten Befehl angeben, wird dieser standardmäßig verwendet echo. xargsGenerieren Sie immer eine einzelne Ausgabezeile, auch wenn die Eingabedaten mehrere Zeilen umfassen.

Wenn wir lsdie -1Option (jede Zeile listet eine Datei auf) verwenden, erhalten Sie einen Dateinamen:

$ ls -1 ./*.sh

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

xargsWelche Art von Effekt erhalten wir, wenn wir das Ausgabeergebnis durch die Pipeline leiten ?

$ ls -1 ./*.sh | xargs

Wie Sie sehen können, wird die Ausgabe als lange Textfolge in das Terminal geschrieben. Dies zeigt, dass xargsSie die Ausgabe als Parameter an andere Befehle übergeben können.

Verwenden Sie xargs mit dem Befehl wc

Wir können den xargsBefehl verwenden, um es wceinem Befehl zu erleichtern , die Anzahl der Wörter in mehreren Dateien, die Anzahl der Zeichen und Zeilen zu berechnen

$ ls *.c | xargs wc

Die Ausführungsergebnisse sind wie folgt:

Das Ergebnis der Befehlsausführung zeigt die statistischen Informationen und die Gesamtzahl jeder Datei.

Dieser Befehl hat die folgenden Aktionen ausgeführt:

  • lsAlle .page-Dateien werden aufgelistet und die Liste wird an übergeben xargs.
  • xargsÜbergeben Sie alle Dateinamen an wc.
  • wc Behandeln Sie diese Dateinamen als Befehlszeilenparameter.

Verwenden Sie xargs mit Bestätigungsnachricht

Wir können die -p(interaktive) Option verwenden, um eine xargsEingabeaufforderung zu erstellen. Gehen wir zum nächsten Schritt.

Wenn wir xargsden touchBefehl string string übergeben, touchwerden diese Dateien erstellt.

$ echo 'one two three' | xargs -p touch

Zeigt den Befehl werden auf dem Terminal ausgeführt wird , xargswartet auf uns zu geben y, oder Y, noder Ndrücken Sie die Eingabetaste zu reagieren. Wenn es nur gedrückt wird Enter, wird es berücksichtigt n. Nur wenn wir bei der Eingabe yoder Ywenn der Befehl ausgeführt wird.

Wir drücken die yEingabetaste und lsprüfen dann mit, ob die Datei erstellt wurde.

$ ls one two three

Verwenden Sie xargs mit mehreren Befehlen

Wir können -Idie Option (Anfangsparameter) verwenden, xargsum sie mit mehreren Befehlen zu verwenden. Diese Option ist definiert 替换字符串. Überall in der Befehlszeile wird die Ersatzzeichenfolge angezeigt, die zum Einfügen von xargsWerten bereitgestellt wird .

Es ist ein bisschen abstrakt, lassen Sie es uns anhand eines Beispiels erklären.

Wir verwenden zuerst tree, um das aktuelle Verzeichnis in einem Unterverzeichnis des Befehls anzuzeigen. Mit der -dOption (Verzeichnis) kann der treeBefehl die Datei ignorieren, nur das Ausgabeverzeichnis.

$ tree -d

Es gibt jetzt nur ein Unterverzeichnisbild.

In der Datei directories.txt haben wir die Namen einiger Verzeichnisse, die wir erstellen möchten. Wir verwenden zuerst cat, um den Inhalt anzuzeigen.

$ cat directories.txt

Wir übergeben diese Inhalte als Eingabedaten xargsund führen die folgenden Befehle aus:

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

Dieser Befehl hat die folgenden Aktionen ausgeführt:

  • cat directories.txt : Übergibt den Inhalt der Datei directories.txt (Namen aller zu erstellenden Verzeichnisse) an xargs.
  • xargs -I% : Die Ersatzzeichenfolge ist definiert %.
  • sh -c : Startet eine neue Subshell. -c(Kommond) Lassen Sie die Shell Befehle lesen.
  • 'echo%; mkdir%' : Jeder wird ersetzt und xargsüber den Verzeichnisnamen übertragen. echoBefehl zum Drucken des Verzeichnisnamens, mkdirBefehl zum Erstellen eines Verzeichnisses.

Ergebnis der Befehlsausführung:

Wir können treeüberprüfen, ob Sie ein Verzeichnis erstellt haben.

$ tree -d

Kopieren Sie Dateien an mehrere Speicherorte

Wir können den xargsBefehl verwenden, um einen Befehl zum Kopieren der Dateien an mehrere Speicherorte zu verwenden.

Übergeben Sie zunächst die Namen der beiden Verzeichnisse durch eine Pipe xargs. Und lassen Sie die xargsZeit nur einen der Parameter an den verwendeten Befehl übergeben.

Wenn Sie cpjeweils zweimal mit einem der beiden Verzeichnisse als Befehlszeilenargumente aufrufen möchten, können Sie eine xargsvon -n1 zu implementierende Option (maximale Anzahl) festlegen.

Es wird auch die -vOption (ausführliche Details) verwendet, damit cpdie Rückmeldung ausgeführt wird.

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

Wir haben die Dateien in zwei Verzeichnisse kopiert, jeweils ein Verzeichnis. cpDie detaillierten Informationen wurden zurückgemeldet, sodass wir sehen konnten, welche Maßnahmen ergriffen wurden.

Löschen Sie Dateien in verschachtelten Verzeichnissen

Wenn der Dateiname Leerzeichen oder andere Sonderzeichen enthält (z. B. Zeilenumbrüche), werden xargsdiese Dateinamen nicht richtig interpretiert. Wir können die -0Option (null terminator) verwenden, um dieses Problem zu lösen. In diesem Fall xargsdie Verwendung nullvon Zeichen als Dateiname des endgültigen Trennzeichens.

Hier findbefehlen wir als Beispiel. findEs gibt eigene Optionen für den Umgang mit Leerzeichen und Sonderzeichen in Dateinamen -print0, dh die Option (vollständiger Name, leeres Zeichen).

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

Dieser Befehl führt die folgenden Aktionen aus:

  • find. -name “* .png” : findSuchen Sie im aktuellen Verzeichnis nach Objekten, deren Name mit * .png übereinstimmt, und type -fgeben Sie an, nur nach Dateien zu suchen.
  • -print0 : Der Name endet mit einem Nullzeichen und Leerzeichen und Sonderzeichen sind reserviert.
  • xargs -0 : xargsEs wird auch berücksichtigt, dass der Dateiname mit einem Nullwert endet und Leerzeichen und Sonderzeichen keine Probleme verursachen.
  • rm -v -rf "{}" : rmFeedback zur laufenden Operation ( -v), rekursive Ausführung der Operation (-r) und direktes Löschen der Datei ohne Senden einer Fehlermeldung ( -f). Ersetzen Sie "{}" durch jeden Dateinamen.

Nachdem der Befehl ausgeführt wurde, werden alle Unterverzeichnisse durchsucht und die übereinstimmenden Dateien gelöscht.

Verschachtelte Verzeichnisse löschen

Angenommen, wir möchten eine Reihe verschachtelter Unterverzeichnisse löschen und zuerst treezum Anzeigen verwenden.

$ tree -d

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

Dieser Befehl verwendet find, um rekursiv im aktuellen Verzeichnis zu suchen. Das Suchziel ist ein Verzeichnis mit dem Namen level_one, und dann wird der Verzeichnisname xargsübergeben rm.

Der Unterschied zwischen diesem Befehl und dem vorherigen Befehl besteht darin, dass das gesuchte Element der Name des obersten Verzeichnisses ist und -type ddas zu findende Verzeichnis und nicht die Datei angibt.

Der Name jedes Verzeichnisses wird beim Löschen ausgedruckt. Wir können treeden Effekt noch einmal überprüfen:

$ tree -d

Alle verschachtelten Unterverzeichnisse wurden gelöscht.

Löschen Sie alle Dateien mit Ausnahme eines Dateityps

Wir können verwenden find, xargsund rmlöschen Sie alle Arten von Dateien und halten nur eine Art von Datei , die wir behalten wollen. Dies muss den Dateityp angeben, den Sie behalten möchten.

-notOptionen ermöglichen finddie Rückgabe aller Suchmuster, die nicht mit dem Dateinamen übereinstimmen. An dieser Stelle verwenden wir wieder xargsdie -IOption (Anfangsparameter). Die diesmal definierte Ersatzzeichenfolge ist {}. Dies ist die Ersatzzeichenfolge, die wir verwendet haben, bevor der %Effekt gleich ist.

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

Nachdem der Befehl ausgeführt wurde, übergeben wir ls, um die Ergebnisse zu bestätigen. Wir können das Verzeichnis und nur die *.shübereinstimmenden Dateien sehen.

$ ls -l

Verwenden Sie Xargs, um komprimierte Dateien zu erstellen

Mit dem findBefehl können wir nach Dateien anhand des xargsDateinamens suchen , der an den tarBefehl übergeben wird, um eine komprimierte Datei zu erstellen.

Wir werden in den aktuellen Verzeichnisdateien suchen * .sh.

$ find ./ -name "*.sh" -type 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.

Schließlich fragten mich kürzlich viele Freunde nach einer Linux-Lern-Roadmap. Aufgrund meiner Erfahrung verbrachte ich einen Monat damit, in meiner Freizeit lange wach zu bleiben, und stellte ein E-Book zusammen. Ob Sie in einem Interview sind oder sich selbst verbessern, ich glaube, es wird Ihnen helfen! Das Verzeichnis lautet wie folgt:

Gib es allen kostenlos, bitte dich, mir einen Daumen hoch zu geben!

Ebook | Linux-Entwicklungs-Lern-Roadmap

Ich hoffe auch, dass einige Freunde sich mir anschließen können, um dieses E-Book noch perfekter zu machen!

Dazugewinnen? Ich hoffe, dass die alten Eisen eine Drei-Treffer-Kombination haben, damit mehr Leute diesen Artikel lesen können

Literatur-Empfehlungen:

Ich denke du magst

Origin blog.csdn.net/yychuyu/article/details/108209770
Empfohlen
Rangfolge