Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 9 Nützliche Funktionen
  gp 9.1 Der Befehl eval
  gp 9.2 xargs
  gp 9.3 dirname und basename
  gp 9.4 umask
  gp 9.5 ulimit (Builtin)
  gp 9.6 time
  gp 9.7 typeset


Rheinwerk Computing

9.2 xargtoptop

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.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern