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 xargs
Befehl verwenden. xargs
Sie 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.
xargs
Es ist ein Befehl, der den Standarddatenfluss verwendet, um eine Ausführungspipeline zu erstellen. Durch die Verwendung von xargs
Befehl können wir machen echo
, rm
und mkdir
so auf Befehl akzeptiert die Standardeingabe als Parameter.
Befehl xargs
xargs
Akzeptieren Sie Pipeline-Eingaben. Sie können auch Eingaben aus einer Datei akzeptieren. xargs
Verwenden Sie diese Eingabe als Parameter des von uns angegebenen Befehls. Wenn wir keinen xargs
bestimmten Befehl angeben, wird dieser standardmäßig verwendet echo
. xargs
Generieren Sie immer eine einzelne Ausgabezeile, auch wenn die Eingabedaten mehrere Zeilen umfassen.
Wenn wir ls
die -1
Option (jede Zeile listet eine Datei auf) verwenden, erhalten Sie einen Dateinamen:
$ ls -1 ./*.sh
Dieser Befehl listet die Shell-Skriptdateien im aktuellen Verzeichnis auf.
xargs
Welche 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 xargs
Sie die Ausgabe als Parameter an andere Befehle übergeben können.
Verwenden Sie xargs mit dem Befehl wc
Wir können den xargs
Befehl verwenden, um es wc
einem 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:
ls
Alle .page-Dateien werden aufgelistet und die Liste wird an übergebenxargs
.xargs
Übergeben Sie alle Dateinamen anwc
.wc
Behandeln Sie diese Dateinamen als Befehlszeilenparameter.
Verwenden Sie xargs mit Bestätigungsnachricht
Wir können die -p
(interaktive) Option verwenden, um eine xargs
Eingabeaufforderung zu erstellen. Gehen wir zum nächsten Schritt.
Wenn wir xargs
den touch
Befehl string string übergeben, touch
werden diese Dateien erstellt.
$ echo 'one two three' | xargs -p touch
Zeigt den Befehl werden auf dem Terminal ausgeführt wird , xargs
wartet auf uns zu geben y
, oder Y
, n
oder N
drücken Sie die Eingabetaste zu reagieren. Wenn es nur gedrückt wird Enter
, wird es berücksichtigt n
. Nur wenn wir bei der Eingabe y
oder Y
wenn der Befehl ausgeführt wird.
Wir drücken die y
Eingabetaste und ls
prüfen dann mit, ob die Datei erstellt wurde.
$ ls one two three
Verwenden Sie xargs mit mehreren Befehlen
Wir können -I
die Option (Anfangsparameter) verwenden, xargs
um sie mit mehreren Befehlen zu verwenden. Diese Option ist definiert 替换字符串
. Überall in der Befehlszeile wird die Ersatzzeichenfolge angezeigt, die zum Einfügen von xargs
Werten 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 -d
Option (Verzeichnis) kann der tree
Befehl 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 xargs
und 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 undxargs
über den Verzeichnisnamen übertragen.echo
Befehl zum Drucken des Verzeichnisnamens,mkdir
Befehl 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 xargs
Befehl 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 xargs
Zeit nur einen der Parameter an den verwendeten Befehl übergeben.
Wenn Sie cp
jeweils zweimal mit einem der beiden Verzeichnisse als Befehlszeilenargumente aufrufen möchten, können Sie eine xargs
von -n
1 zu implementierende Option (maximale Anzahl) festlegen.
Es wird auch die -v
Option (ausführliche Details) verwendet, damit cp
die 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. cp
Die 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 xargs
diese Dateinamen nicht richtig interpretiert. Wir können die -0
Option (null terminator) verwenden, um dieses Problem zu lösen. In diesem Fall xargs
die Verwendung null
von Zeichen als Dateiname des endgültigen Trennzeichens.
Hier find
befehlen wir als Beispiel. find
Es 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” :
find
Suchen Sie im aktuellen Verzeichnis nach Objekten, deren Name mit * .png übereinstimmt, undtype -f
geben Sie an, nur nach Dateien zu suchen. - -print0 : Der Name endet mit einem Nullzeichen und Leerzeichen und Sonderzeichen sind reserviert.
- xargs -0 :
xargs
Es wird auch berücksichtigt, dass der Dateiname mit einem Nullwert endet und Leerzeichen und Sonderzeichen keine Probleme verursachen. - rm -v -rf "{}" :
rm
Feedback 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 tree
zum 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 d
das zu findende Verzeichnis und nicht die Datei angibt.
Der Name jedes Verzeichnisses wird beim Löschen ausgedruckt. Wir können tree
den 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
, xargs
und rm
lö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.
-not
Optionen ermöglichen find
die Rückgabe aller Suchmuster, die nicht mit dem Dateinamen übereinstimmen. An dieser Stelle verwenden wir wieder xargs
die -I
Option (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 find
Befehl können wir nach Dateien anhand des xargs
Dateinamens suchen , der an den tar
Befehl ü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: