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

So verwenden Sie den leistungsstarken Xargs-Befehl unter Linux [Erklärt mit Beispielen]

xargs ist einer der mächtigsten Befehle in Linux. In diesem Tutorial zeige ich Ihnen, wie Sie xargs verwenden können, um die Standardeingabe in Befehle umzuwandeln.

Was ist der xargs-Befehl?

Der xargs-Befehl liest Textzeilen von der Standardeingabe oder von der Ausgabe eines anderen Befehls und wandelt sie in Befehle um und führt sie aus.

Sie werden häufig feststellen, dass der Befehl xargs zusammen mit dem Befehl find verwendet wird. Der find-Befehl gibt Ihnen eine Liste von Dateinamen und der xargs-Befehl lässt Sie diese Dateinamen einen nach dem anderen verwenden, als ob sie in den anderen Befehl eingegeben worden wären.

Da xargs bei der Umleitung funktioniert, empfehle ich dringend, Ihr Wissen über stdin, stdout und Pipe-Umleitung in Linux aufzufrischen.

Wie verwende ich den xargs-Befehl?

Der xargs-Befehl hat die folgende Syntax:

xargs [options] [command [initial-arguments]]

Aber Sie werden es wahrscheinlich nicht so verwenden. Seine Stärke liegt darin, die Ausgabe eines Befehls mit einem anderen zu kombinieren. Sehen wir es uns an einem einfachen Beispiel an.

In meinem aktuellen Verzeichnis habe ich einige Textdateien und die flowers.txt hat den Namen all dieser Dateien:

[email protected]:~/tutorial$ ls
flowers.txt  lily.txt  one_lotus.txt  rose.txt  three_lotus.txt  two_lotus.txt
[email protected]:~/tutorial$ cat flowers.txt 
lily.txt
one_lotus.txt
rose.txt
three_lotus.txt
two_lotus.txt

Jetzt möchte ich die Dateigröße aller in der flowers.txt erwähnten Dateien sehen. Der gesunde Menschenverstand sagt, dass ich den cat-Befehl kombinieren könnte, um alle Dateinamen anzuzeigen, und ihn dann an den du-Befehl weiterleiten könnte, um die Dateigröße zu überprüfen.

Aber wenn ich es direkt weiterleite, gibt es nicht die Größe jeder der Dateien an, die in der Datei flowers.txt erwähnt werden.

[email protected]:~/tutorial$ du -h
52K	.
[email protected]:~/tutorial$ cat flowers.txt | du -h
52K	.

Wieso den? Erstens akzeptiert der Befehl du keine Standardeingabe. Zweitens besteht die Ausgabe des cat-Befehls nicht aus einzelnen Dateinamen. Es ist wie ein Wort, das durch ein Zeilenumbruchzeichen getrennt ist.

Die Magie des xargs-Befehls besteht darin, dass dieser und der durch Leerzeichen oder neue Zeilen getrennte Text in einzelne Eingaben für den nächsten Befehl umgewandelt werden.

[email protected]:~/tutorial$ cat flowers.txt | xargs du -h
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Betrachten Sie es als äquivalent dazu, diese Dateinamen dem du-Befehl zuzuführen:

[email protected]:~/tutorial$ du -h lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt 
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Sie erkennen jetzt die Leistungsfähigkeit des xargs-Befehls, nicht wahr?

xargs und find:füreinander gemacht

Sie werden es oft in Kombination mit dem „Suchbefehl“ finden. Der Befehl find sucht nach Dateien und Verzeichnissen und gibt ihre Namen zurück. Dank xargs können Sie das Ergebnis des Suchbefehls für bestimmte Zwecke verwenden, z. B. umbenennen, verschieben, löschen und vieles mehr.

Angenommen, Sie möchten alle Dateien erhalten, die auf .txt enden und das Wort rot enthalten. Sie können find- und grep-Befehle mit Hilfe von xargs kombinieren:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt

Umgang mit Dateinamen mit Leerzeichen

Wenn Sie eine Datei mit Leerzeichen im Namen haben, führt dies zu Problemen. Nehmen wir an, ich habe „drei_lotus.txt“ in „drei lotus.txt“ umbenannt. Wenn es jetzt über xargs verarbeitet wird, wird es als zwei separate Dateien als drei und lotus.txt angesehen.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./two_lotus.txt
grep: ./three: No such file or directory
grep: lotus.txt: No such file or directory
./rose.txt

In solchen Fällen sollten Sie die Option -print0 des Find-Befehls verwenden. Es trennt Zeilen mit ASCII-Nullzeichen anstelle von Zeilenumbruchzeichen. In ähnlicher Weise sollten Sie auch xargs mit -0 verwenden, um die ASCII-Nullen zu akzeptieren.

[email protected]:~/tutorial$ find . -type f -print0 -name "*.txt" | xargs -0 grep -l red
./two_lotus.txt
./three lotus.txt
./rose.txt

Sehen Sie, welcher Befehl ausgeführt wird

Wenn Sie sehen möchten, welcher Befehl mit Hilfe von xargs ausgeführt wird, können Sie die Option -t verwenden. Es wird der aktuell ausgeführte Befehl ausgegeben.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -t touch
touch ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt

Zwingen Sie xargs, vor dem Ausführen des Befehls zur Bestätigung aufzufordern

Einige Situationen erfordern besondere Vorsicht, wie das Löschen von Dateien. Es ist eine gute Idee, zu sehen, welcher Befehl ausgeführt wird, und die Option zu haben, die Ausführung abzulehnen.

Sie können die Option -p von xargs verwenden, um die Eingabeaufforderung zu erhalten.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p rm
rm ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...n

Platzhalter mit xargs verwenden, um mehr Kontrolle darüber zu erlangen

Standardmäßig fügt der Befehl xargs die Standardeingabe als Argument am Ende des Befehls hinzu. Dies führt zu einem Problem, wenn Sie das vor dem letzten Argument verwenden müssen.

Wenn Sie beispielsweise den Move-Befehl verwenden, benötigen Sie zuerst die Quelle und dann das Ziel. Wenn Sie die gefundenen Dateien in ein Zielverzeichnis verschieben möchten, funktioniert dieser Befehl nicht:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p mv new_dir
mv new_dir ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...y
mv: target './rose.txt' is not a directory

Hier können Sie Platzhalter in xargs mit der Option -I like this:

verwenden
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p -I {} mv {} new_dir
mv ./three_lotus.txt new_dir ?...n
mv ./two_lotus.txt new_dir ?...n
mv ./lily.txt new_dir ?...n
mv ./rose.txt new_dir ?...n

Stellen Sie sich das so vor, als ob xargs alle Dateinamen aus dem find-Befehl erhält und in {} behält. Dann geht es zum mv-Befehl und liefert den Inhalt von {}.

Der Hauptunterschied besteht darin, dass nicht alle Dateinamen in denselben Befehl eingefügt werden, sondern sie einzeln hinzugefügt werden. Aus diesem Grund wurde für jedes Argument der Befehl mv aufgerufen (wie Sie im obigen Beispiel sehen können).

Hinweis:Ich habe {} als Platzhalter verwendet. Sie können die meisten anderen Buchstaben oder Zeichen als Platzhalter verwenden. {} ist sicher und einfach zu verstehen und zu unterscheiden.

Mehrere Befehle mit xargs ausführen

Sie können die Platzhalter verwenden, um mehrere Befehle mit xargs auszuführen.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}' 
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./three_lotus.txt
0	./three_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./two_lotus.txt
0	./two_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./lily.txt
0	./lily.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./rose.txt
0	./rose.txt

Beachten Sie, dass sich der Platzhalter nicht auf die nächste Pipe-Umleitung oder einen anderen Befehl erstreckt. Deshalb habe ich hier den Befehl sh verwendet.

Es gibt immer mehr...

Ich habe in den Beispielen hier hauptsächlich den Befehl find with xargs verwendet, weil Sie das am häufigsten sehen werden. Das bedeutet jedoch nicht, dass xargs nur mit dem Befehl find verwendet werden darf. Ein solches praktisches Beispiel für den xargs-Befehl ist, wenn Sie alle laufenden Docker-Container stoppen möchten:

docker ps -q | xargs docker stop

Wie bei den meisten anderen Linux-Befehlen gibt es auch bei xargs viele weitere Optionen. Weitere Informationen finden Sie jederzeit auf der Manpage des xargs-Befehls.

Ich denke, die hier aufgeführten xargs-Befehlsbeispiele reichen aus, um Ihnen ein gutes Verständnis dieses großartigen Befehls zu vermitteln.

Wenn Sie Fragen oder Anregungen haben, lassen Sie es mich bitte im Kommentarbereich wissen.


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. So verwenden Sie den Verlaufsbefehl unter Linux

  3. Welcher Befehl in Linux [Erklärt mit Beispielen]

  4. So verwenden Sie den id-Befehl unter Linux

  5. So verwenden Sie den Befehl „screen“ unter Linux

So verwenden Sie den obersten Befehl unter Linux

So verwenden Sie den Linux-Ping-Befehl

So verwenden Sie den fd-Befehl auf einem Linux-System

Wie verwende ich den wget-Befehl unter Linux?

Wie verwende ich den xargs-Befehl unter Linux?

So verwenden Sie den RPM-Befehl unter Linux