GNU/Linux >> LINUX-Kenntnisse >  >> Linux

8 praktische Beispiele für den Linux-Xargs-Befehl für Anfänger

Die Linux-xargs Der Befehl ist vielleicht kein sehr beliebtes Befehlszeilentool, aber das ändert nichts an der Tatsache, dass er äußerst nützlich ist, insbesondere in Kombination mit anderen Befehlen wie find und grep . Wenn Sie neu bei xargs sind und seine Verwendung verstehen möchten, werden Sie froh sein zu wissen, dass wir genau das hier tun werden.

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.

1. Wie funktioniert der Xargs-Befehl?

Nun, bevor Sie sich mit der Verwendung befassen, ist es wichtig zu verstehen, was genau Xargs tut. Laienhaft ausgedrückt liest das Tool - in seiner grundlegendsten Form - Daten von der Standardeingabe (stdin) und führt den Befehl (der ihm als Argument zugeführt 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 kein Befehl als Argument an xargs übergeben wird, ist der Standardbefehl, den das Tool ausführt, echo . Im folgenden Beispiel habe ich beispielsweise gerade „xargs“ ausgeführt und „Hello World“ in stdin eingegeben. Als ich Strg+D drückte (um xargs mitzuteilen, dass wir mit der Eingabe fertig sind), wurde das echo Befehl wurde automatisch ausgeführt und 'Hello World' wurde erneut ausgegeben.

2. Wie verwende ich xargs mit einem anderen Befehl?

Während echo der Standardbefehl ist, den xargs ausführt, können Sie jeden anderen Befehl explizit angeben. Beispielsweise können Sie den Suchbefehl zusammen mit der Option „-name“ als Argument an xargs übergeben und dann den Namen der Datei (oder des Dateityps), die Sie finden möchten um als Eingabe durch stdin zu suchen.

Hier ist der vollständige fragliche Befehl:

xargs find -name

Zum Beispiel haben wir "*.txt" in der Eingabe über stdin bereitgestellt, was bedeutet, dass wir das finden wollen Befehl, um alle .txt-Dateien im aktuellen Verzeichnis (sowie seinen Unterverzeichnissen) zu durchsuchen.

Hier ist der Befehl in Aktion:

3. Wie man xargs dazu bringt, den Befehl mehrmals auszuführen (einmal für jede Eingabezeile/jedes 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. Was aber, wenn auch nach anderen Dateitypen wie .log und .tmp gesucht werden soll?

Versuchen Sie, diese nach "*.txt" als Eingabe an xargs zu übergeben, und sehen Sie, was passiert. Nun, Sie sollten eine Fehlermeldung ähnlich der folgenden erhalten:

Das liegt daran, dass xargs "*.txt" und "*.log" als Dateinameneingabe an find übergibt Befehl und dann finden schlägt fehl, da es mit zwei Dateinamen in der Eingabe ausgeführt wird. Sie können sich den Find-Befehl folgendermaßen vorstellen:

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

Und es ist nicht der richtige Weg.

Was wir wollen, ist, dass der xargs-Befehl zuerst "*.txt" an find übergeben sollte Befehl, damit find gibt uns Ergebnisse im Zusammenhang mit .txt-Dateien, und dann wird "*.log" übergeben. Dies kann mit dem -L erfolgen Befehlszeilenoption xargs bietet.

Das -L Die Befehlszeilenoption erfordert eine Zahl, die als maximale Anzahl nicht leerer Zeilen behandelt wird, die auf einmal als Eingabe an den Befehl übergeben werden sollten. In unserem Fall ist dieser Wert also 1, da wir möchten, dass eine Eingabezeile als Eingabe an find übergeben wird auf einmal.

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:

So weit, ist es gut. Was aber, wenn Sie die Eingabe folgendermaßen übergeben:

"*.txt" "*.log"

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

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

Die Befehlszeilenoption „-n“ erfordert wie „-L“ eine Zahl, die die Anzahl der Argumente darstellt, die xargs pro Befehlszeile übergeben soll. In dem gerade besprochenen Fall sollten „*.txt“ und „*.log“ unterschiedliche Argumente sein, und da wir möchten, dass sie einzeln übergeben werden, müssen wir „1“ als Wert für „-n“ angeben. .

xargs -n 1 find -name

Auf diese Weise können wir xargs dazu bringen, einen Befehl mehrmals auszuführen.

4. Wie man Xargs dazu bringt, Dateinamen mit Leerzeichen zu verarbeiten

Wenn Sie sich erinnern, haben wir am Anfang erwähnt, dass xargs Leerzeichen (sowie Zeilenumbruchzeichen) als Trennzeichen behandelt. Dies kann Probleme verursachen, wenn die Dateinamen, die als Eingabe an xargs übergeben werden, Leerzeichen enthalten.

Angenommen, das aktuelle Verzeichnis enthält eine Datei mit dem Namen „neue Musik.mp3“ und Sie möchten, dass xargs diesen Namen an mplayer weitergibt damit dieser die Datei abspielen kann. Wenn Sie den herkömmlichen Weg gehen, erhalten Sie eine Fehlermeldung:

Das liegt daran, dass aufgrund des Leerzeichens zwischen „new“ und „music.mp3“ diese von mplayer als zwei verschiedene Dateien behandelt werden. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, bei der Eingabe einen Backslash zu verwenden:

new\ music.mp3

Die andere Möglichkeit besteht darin, das Trennzeichen zu ändern, was Sie mit -d tun können Möglichkeit. Beispielsweise können Sie xargs auffordern, nur den Zeilenumbruch als Trennzeichen zu betrachten, was auf folgende Weise geschehen kann:

xargs -d '\n' mplayer

5. Wie man Xargs dazu bringt, Dateinamen mit Zeilenumbrüchen zu behandeln

Jetzt wissen wir also, wie wir Xargs dazu bringen können, Dateinamen zu verarbeiten, die Leerzeichen enthalten. Aber was ist mit Zeilenumbrüchen? Ja, Dateinamen können auch Zeilenumbrüche enthalten. Beispielsweise gibt es eine Datei mit dem Namen „foo“ [newline] „file.txt“. Auf dem Terminal wird der Name als „foo?file.txt“ angezeigt.

Angenommen, ich möchte finden Befehl, um alle Dateien zu finden, deren Namen mit dem Text „foo“ beginnen, und verwenden Sie dann xargs, um diese Dateien in gedit zu öffnen . Hier ist der Befehl:

find . -name "foo*" | xargs gedit

Leider erfüllt 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 lösen, verwenden Sie -print0 Option, die Angebote findet und mit -0 von xarg koppelt Möglichkeit. So erklärt die Manpage 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, die einen bestimmten Text enthalten

Der xargs-Befehl ist sehr praktisch, wenn Sie nach Dateien suchen möchten, die einen bestimmten Text/eine bestimmte Zeichenfolge enthalten. Wenn Sie beispielsweise .txt-Dateien finden möchten, die den Text „abc“ enthalten, können Sie dies folgendermaßen tun:

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

Hier ist der Befehl in Aktion:

Wie ziemlich offensichtlich ist, erhält der xargs-Befehl in diesem Fall seine Eingabe von find Befehl.

7. Xargs dazu bringen, Eingaben aus einer Datei zu akzeptieren 

Bisher haben wir gesehen, dass xargs Eingaben von stdin (was das Standardverhalten ist) sowie von einem anderen Befehl (der im letzten Abschnitt besprochen wurde) akzeptiert. Wenn Sie möchten, können Sie xargs jedoch auch Eingaben aus einer Datei akzeptieren lassen.

Der Befehl ist -a Option können Sie dies tun. Diese Option erwartet einen Dateinamen - dies wäre die Datei, aus der xargs Eingaben lesen wird.

Angenommen, es gibt eine Datei mit dem Namen „input.txt“. Es enthält die Eingabe für xargs (im Grunde besteht der Inhalt aus zwei Dateinamen:testfile1.txt und testfile2.txt). So können xargs verwendet werden, um Eingaben aus dieser Datei zu lesen und sie an einen anderen Befehl zu übergeben, sagen wir ls .

xargs -a input.txt ls -lart

Hier ist der Befehl in Aktion:

8. Wie man Xargs dazu bringt, die Benutzererlaubnis einzuholen, bevor ein Befehl ausgeführt wird

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

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

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


Linux
  1. 10 „rm“-Befehlsbeispiele für Linux-Anfänger

  2. 10 Beispiele für Linux-Cat-Befehle für Anfänger

  3. Linux-CD-Befehls-Tutorial für Anfänger (8 Beispiele)

  4. Linux-Killall-Befehl für Anfänger (8 Beispiele)

  5. xargs-Befehlsbeispiele in Linux

Linux ss Command Tutorial für Anfänger (8 Beispiele)

Linux-Suchbefehl für Anfänger (8 Beispiele)

16 praktische Beispiele für Linux LS-Befehle für Anfänger

Linux-mv-Befehl für Anfänger erklärt (8 Beispiele)

12 praktische Beispiele für In Command unter Linux

Beispiele für xargs-Befehle unter Linux