8 Praktische Beispiele für den Linux Xargs Befehl

Der Linux-Befehl xargs ist vielleicht kein sehr beliebtes Befehlszeilenprogramm, aber das nimmt der Tatsache nicht die Bedeutung, dass er extrem nützlich ist, besonders in Kombination mit anderen Befehlen wie find und grep. Wenn du neu bei xargs bist und seine Verwendung verstehen willst, wirst du froh sein zu wissen, dass wir genau das hier tun werden.

1. Wie funktioniert der Xargs-Befehl?

Nun, bevor man sich auf seine Verwendung konzentriert, ist es wichtig zu verstehen, was genau Xargs macht. Laienhaft ausgedrückt, liest das Werkzeug – in seiner einfachsten Form – Daten aus der Standardeingabe (stdin) und führt den Befehl (der ihm als Argument geliefert wird) ein- oder mehrmals basierend auf der gelesenen Eingabe aus. Alle Leerzeichen und Leerzeichen in der Eingabe werden als Trennzeichen behandelt, während Leerzeilen ignoriert werden.

Wenn xargs kein Befehl als Argument übergeben wird, ist der Standardbefehl, den das Tool ausführt, echo. Im folgenden Beispiel habe ich beispielsweise gerade ‚xargs‘ ausgeführt und ‚Hello World‘ auf stdin eingegeben. Als ich Strg+D drückte (um xargs zu sagen, dass wir mit der Eingabe fertig sind), wurde der echo-Befehl automatisch ausgeführt und ‚Hello World‘ wurde wieder gedruckt.

Wie funktioniert der Befehl xargs?

2. Wie kann man xargs mit einem anderen Befehl verwenden?

Während echo der Standardbefehl ist, den xargs ausführt, können Sie jeden anderen Befehl explizit angeben. Sie können beispielsweise den Befehl find zusammen mit der Option‘-name‘ als Argument an xargs übergeben und dann den Namen der Datei (oder des Dateityps) übergeben, die Sie als Eingabe in stdin suchen möchten.

Hier ist der komplette Befehl in Frage:

xargs find -name

Zum Beispiel haben wir „*.txt“ in der Eingabe über stdin bereitgestellt, was bedeutet, dass der Befehl find alle.txt-Dateien im aktuellen Verzeichnis (sowie seine Unterverzeichnisse) durchsuchen soll.

Hier ist der Befehl in Aktion:

Kombinieren Sie xargs mit anderen Befehlen.

3. Wie man xargs dazu bringt, den Befehl mehrmals auszuführen (einmal für jede Eingabezeile/Argument).

In dem Beispiel, das wir im vorherigen Abschnitt besprochen haben, wollten wir nach.txt-Dateien suchen, also haben wir „*.txt“ in der Eingabe angegeben. Aber was wäre, wenn die Anforderung darin besteht, auch nach anderen Dateitypen wie.log und.tmp zu suchen?

Versuchen Sie, diese als Input an xargs nach „*.txt“ zu geben und sehen Sie, was passiert. Nun, du solltest einen Fehler ähnlich dem folgenden erhalten:

xargs mehrmals ausführen

Das liegt daran, dass xargs „*.txt“ und „*.log“ als Dateinamenseingabe an den Befehl find übergibt und dann bei der Ausführung mit zwei Dateinamen in der Eingabe scheitert. Sie können sich vorstellen, dass der Befehl find wie folgt ausgeführt wird:

find -name "*.txt" "*.log"

Und es ist nicht der richtige Weg.

Was wir wollen, ist, dass der xargs-Befehl zuerst „*.txt“ an den find-Befehl übergeben sollte, so dass find uns Ergebnisse in Bezug auf .txt-Dateien liefert, und dann „*.log“ übergeben wird. Dies kann mit der von xargs bereitgestellten Kommandozeilenoption -L erfolgen.

Die Befehlszeilenoption -L benötigt eine Zahl, die sie als die maximale Anzahl von nicht-leeren Zeilen behandelt, die gleichzeitig als Eingabe an den Befehl übergeben werden sollen. In unserem Fall ist dieser Wert also 1, da wir möchten, dass eine Eingabezeile als Input übergeben wird, um sie gleichzeitig zu finden.

Also, hier ist der Befehl, den wir ausführen sollten:

xargs -L 1 find -name

Der folgende Screenshot zeigt den oben genannten Befehl in Aktion:

xargs input / output

So weit, so gut. Aber was ist, wenn Sie die Eingabe auf folgende Weise übergeben:

"*.txt" "*.log"

Nun, der Befehl wird fehlschlagen, weil ‚-L 1‘ dafür sorgt, dass die komplette Zeile an den Befehl find übergeben wird.

Xargs -L flag

In solchen Situationen können Sie die Befehlszeilenoption‘-n‘ verwenden.

Die Kommandozeilenoption ‚-n‘, wie ‚-L‘, benötigt eine Zahl, die die Anzahl der Argumente darstellt, die xargs pro Kommandozeile übergeben soll. In dem Fall, in dem wir gerade gesprochen haben, sollten „*.txt“ und „*.log“ verschiedene Argumente sein, und da wir wollen, dass sie einzeln übergeben werden, müssen wir ‚1‘ als Wert für ‚-n‘ angeben.

xargs -n 1 finden -name

Xargs -n Schalter

Dies sind also die Möglichkeiten, wie wir xargs dazu bringen können, einen Befehl mehrmals auszuführen.

4. Wie man xargs dazu bringt, Dateinamen mit Leerzeichen zu behandeln.

Wenn Sie sich erinnern, haben wir eingangs erwähnt, dass xargs Leerzeichen (sowie Leerzeichen und Leerzeichen) als Trennzeichen behandelt. Dies kann zu Problemen führen, wenn die Dateinamen, die als Eingabe an xargs übergeben werden, Leerzeichen enthalten.

Angenommen, das aktuelle Verzeichnis enthält eine Datei mit dem Namen’new music.mp3′, und Sie möchten, dass xargs diesen Namen an den mplayer weitergibt, damit dieser die Datei abspielen kann. Wenn du den konventionellen Weg gehst, bekommst du einen Fehler:

Xargs behandeln Leerzeichen in Dateinamen.

Das liegt daran, dass diese aufgrund des Abstandes zwischen ’new‘ und ‚music.mp3‘ vom mplayer als zwei verschiedene Dateien behandelt werden. Eine Möglichkeit, dieses Problem zu lösen, ist die Verwendung von Backslash während der Eingabe:

new\ music.mp3

Die andere Möglichkeit ist, das Trennzeichen zu ändern, was Sie mit der Option -d tun können. Beispielsweise können Sie xargs bitten, Newline nur als Trennzeichen zu betrachten, was auf folgende Weise geschehen kann:

xargs -d '\n' mplayer

xargs -d Schalter

5. Wie man xargs dazu bringt, Dateinamen mit Zeilenumbruchzeichen zu behandeln.

So, jetzt wissen wir, wie wir xargs dazu bringen können, Dateinamen zu behandeln, die Leerzeichen enthalten. Aber was ist mit Newlines? Ja, Dateinamen können auch Zeilenumbrüche haben. Zum Beispiel gibt es eine Datei namens ‚foo'[newline]’file.txt‘. Auf dem Terminal wird der Name als’foo?file.txt‘ angezeigt.

Xargs behandeln Newline-Zeichen

Nun, nehmen wir an, ich möchte, dass der Befehl find alle Dateien mit Namen findet, die mit dem Text’foo‘ beginnen, und dann xargs verwendet, um diese Dateien in gedit zu öffnen. Hier ist der Befehl:

find . -name "foo*" | xargs gedit

Leider erreicht der Befehl seinen Zweck nicht, da sich in Gedit eine neue Datei mit dem Namen’foo‘ öffnet. Das liegt wahrscheinlich daran, dass das Zeilenumbruchzeichen von xargs als Trennzeichen behandelt wird.

Um dieses Problem zu beheben, verwenden Sie die Option -print0, die Angebote findet und koppelt sie mit der Option -0 von xarg. So erklärt die Manualseite von find diese Option:

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

Also, hier ist der Befehl, den wir verwenden sollten:

find . -name "foo*" -print0 | xargs -0 gedit

6. So finden Sie Dateien mit einem bestimmten Text

Der Befehl xargs ist sehr nützlich, wenn Sie nach Dateien suchen wollen, die einen bestimmten Text/String enthalten. Wenn Sie z.B. .txt-Dateien mit dem Text’abc‘ finden möchten, dann kann dies auf folgende Weise geschehen:

find -name "*.txt" | xargs grep "abc"

Hier ist der Befehl in Aktion:

Xargs und grep

Wie ganz offensichtlich, erhält der Befehl xargs in diesem Fall seine Eingabe aus dem Befehl find.

7. Wie man xargs dazu bringt, Eingaben aus einer Datei zu akzeptieren

Bisher haben wir gesehen, wie xargs Eingaben von stdin (was das Standardverhalten ist) sowie von einem anderen Befehl (siehe letzter Abschnitt) akzeptiert. Wenn Sie möchten, können Sie jedoch auch xargs veranlassen, Eingaben aus einer Datei zu akzeptieren.

Mit der Option -a des Befehls können Sie dies tun. Diese Option erwartet einen Dateinamen – das wäre die Datei, aus der xargs die Eingaben lesen wird.

Angenommen, es gibt eine Datei mit dem Namen’input.txt‘. Es enthält die Eingabe für xargs (im Grunde genommen sind die Inhalte zwei Dateinamen: testfile1.txt und testfile2.txt). Hier ist, wie xargs verwendet werden kann, um Eingaben aus dieser Datei zu lesen und sie an einen anderen Befehl weiterzugeben, z.B. ls.

xargs -a input.txt ls -lart

Hier ist der Befehl in Aktion:

Eingabe von Xargs-Dateien

8. Wie man xargs dazu bringt, vor der Ausführung eines Befehls eine Benutzerberechtigung zu erhalten.

Wir haben bereits besprochen, wie Sie xargs dazu bringen können, einen Befehl mehrmals auszuführen (siehe Punkt 3 oben). Aber was ist, wenn du willst, dass xargs jedes Mal um deine Erlaubnis bittet, wenn es den Befehl ausführt? Ist das möglich? Ja, das ist es – die Kommandozeilenoption -p macht es möglich.

Hier ist ein Beispiel dafür, wie Sie xargs im interaktiven Modus ausführen können:

Xargs fordern Erlaubnis vom Benutzer an

Fazit

Wir haben hier gerade die Oberfläche zerkratzt, da es viele andere Funktionen gibt, die der xargs-Befehl in Form von Befehlszeilenoptionen bietet. Probieren Sie die xargs Konzepte/Features aus, die wir in diesem Tutorial erklärt haben, und gehen Sie im Zweifelsfall die Manpage durch.

Das könnte dich auch interessieren …