9.2 xargs
Unter Linux/UNIX kann man fast alle Befehle auf einzelne oder auch eine ganze Liste von Dateien anwenden. Wenn dies nicht möglich sein sollte oder sich eine Dateiliste nicht mit einer Wildcard erstellen lässt, könnten Sie das Kommando xargs verwenden. xargs erwartet als Parameter ein Kommando, welches dann auf alle Dateien einer Liste angewandt wird, die von der Standardeingabe gelesen werden. Die Syntax:
kommando1 xargs kommando2
Hierbei rufen Sie praktisch »kommando2« mit den Argumenten auf, die »kommando1« in der Standardausgabe erstellt. Das Prinzip ist recht einfach. Das Script sucht in einer Schleife mit find nach allen Dateien im aktuellen Arbeitsverzeichnis (mit Unterverzeichnissen) mit der Endung ».tmp«.
# Name: aremover1
for var in `find . -name "*.tmp"`
do
rm $var
done
Der Shell-Guru wird hier gleich Einspruch erheben und sagen, das geht noch kürzer:
find . -name "*.tmp" -exec rm {} \;
Ich erhebe auch keinen Anspruch, beide Lösungen dürften bezüglich der Laufzeit gleich schlecht sein. Was aber ist so schlecht an diesem Beispiel? Stellen Sie sich vor, Ihr Script findet eine Datei mit der Endung ».tmp« gleich 1000 Mal im aktuellen Arbeitsverzeichnis. Dann wird nach jedem gefundenen Ergebnis das rm-Kommando gestartet. Es werden also 1000 Prozesse hintereinander gestartet und wieder beendet. Für einen Multi-User-Rechner kann das eine ziemliche Last sein. Besser wäre es doch, wenn man dem Kommando rm all diese Dateien als Argument übergibt und somit einen einzigen rm-Aufruf vornimmt. Und genau das ist der Sinn von xargs. Also sieht die Verwendung mit xargs wie folgt aus:
you@host > find . -name "*.tmp" -print | xargs rm
Jetzt werden alle aufgelisteten Files auf einmal über die Pipe an xargs weitergeleitet. xargs übernimmt diese Argumente in einer Liste und verwendet sie wiederum für den rm-Aufruf. Leider treten hier gleich wieder Probleme auf, wenn in einem Dateinamen Leerzeichen enthalten sind, wie dies häufig bspw. bei MP3-Musik- und MS-Windows-Dateien der Fall ist. Das Problem ist hier nämlich, dass xargs die Dateien anhand der Leerzeichen teilt.
Hierzu können Sie xargs mit dem Schalter –0 verwenden, dann wird die Zeichenfolge nicht mehr wegen eines Leerzeichens getrennt, sondern nach einer binären 0. Allerdings wäre dann noch das Problem mit find, welches Sie ebenfalls mit einem Schalter –print0 vermeiden können. So werden mit folgender Kommandoangabe auch diejenigen Dateien gelöscht, bei denen sich ein Leerzeichen im Namen befindet:
you@host > find . -name "*.tmp" -print0 | xargs –0 rm
Aber nicht immer stehen – wie hier bei rm – die eingelesenen Listen, die in den Linux-UNIX-Befehl eingefügt werden sollen, an der richtigen Stelle. So lautet z. B. die Syntax zum Verschieben von Dateien mittels mv:
mv Dateiname Zielverzeichnis
Hierzu können Sie die Zeichenkette »{}« für die Dateinamen verwenden. Diese Zeichenfolge wird als Platzhalter für die Liste von Argumenten genutzt. Wollen Sie also, wie im Beispiel oben, nicht die Dateien mit der Endung ».tmp« löschen, sondern diese zur Sicherheit erst einmal in ein separates Verzeichnis verschieben, so lässt sich dies mit dem Platzhalterzeichen wie folgt erledigen:
you@host > find . -name "*.tmp" -print0 | \
> xargs –0 mv {} $HOME/backups
Natürlich lässt sich mit xargs und den entsprechenden Optionen noch eine Menge mehr anfangen, weshalb das Lesen der Manual-Page sehr empfehlenswert ist.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|