Aus LinuxUser 02/2015

Mit Xargs Ausgaben zum Weiterverarbeiten aufbereiten

© Maksim Shebeko, 123RF

Häppchenweise

Sonderzeichen in Dateinamen bereiten vielen Shell-Tools Probleme. Mit Xargs umschiffen Sie die Hürden elegant.

Komplexe Befehle auf der Kommandozeile erfordern es häufig, die Ausgabe eines Befehls als Eingabe für einen anderen zu verwenden. Ein ganz typisches Beispiel ist das Kommando find: Es listet rekursiv alle den Parametern entsprechenden Dateien auf. So findet der Befehl aus Listing 1 alle Ogg-Vorbis-Dateien im Ordner Podcasts.

Listing 1

$ find Podcasts -name '*.ogg'
Podcasts/dh-20130204-ausgabe-045.ogg
Podcasts/dh-20130107-ausgabe-044.ogg

Möchten Sie nur wissen, ob es sich dabei wirklich ausschließlich um Ogg-Vorbis-Dateien handelt, so prüfen Sie dies mit dem Befehl file nach. Er erhält die Namen der Dateien als Parameter – im Beispiel zwar nur zwei, doch das Tippen der entsprechenden Befehle macht dennoch Arbeit. Dabei gibt es doch die verkehrten Anführungszeichen, englisch „Backticks“. Die Ausgabe des Befehls zwischen den Backticks ergibt dabei den Parameter für den äußeren Befehl (Listing 2).

Listing 2

$ file `find Podcasts -name '*.ogg'`
Podcasts/dh-20130204-ausgabe-045.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps
Podcasts/dh-20130107-ausgabe-044.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps

Stolperfallen

So weit, so gut. Die Funktion trennt die Ausgabe des inneren Befehls an sämtlichen Leerzeichen, inklusive Zeilenumbruch und Tabulator. Das schreit nach der Frage, was passiert, wenn find eine Datei herauspickt, die Leerzeichen im Dateinamen hat. Die Antwort darauf zeigt Listing 3.

Listing 3

$ find Musik -name '*.ogg'
Musik/Roxette - June Afternoon.ogg
Musik/Roxette - I Don't Want to Get Hurt.ogg
$ file `find Musik -name '*.ogg'`
Musik/Roxette: ERROR: cannot open `Musik/Roxette' (No such file or directory)
^C

Mehrere Dinge spielen sich dabei ab: Die Shell hat die Dateinamen an den Leerzeichen aufgetrennt und jeden Teil für sich als einzelnen Parameter verwendet. Das Minuszeichen im Dateinamen übergibt sie ebenfalls als einzelnen Parameter. Der Befehl file interpretiert dies derart, dass er von da ab auf der Standardeingabe auf Daten wartet, um diese zu analysieren. Im vorliegenden Fall bleibt nichts anderes übrig, als den „hängenden“ Befehl mit [Strg]+[C] abzubrechen.

Eine weitere Stolperfalle taucht auf, wenn Sie Backticks verschachteln möchten. In der Praxis passiert dies, wenn Sie zuerst alle Verzeichnisse auflisten, die Sie durchsuchen möchten. Listing 4 zeigt ein Kommando, das alle Verzeichnisse durchforstet, die Podcasts heißen.

Listing 4

$ file `find \`find . -name Podcasts -type d\` -name '*.ogg'`
./lang/Podcasts/dh-20130204-ausgabe-045.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps
./lang/Podcasts/dh-20130107-ausgabe-044.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps
./kurz/Podcasts/dh-20121015-kurz-018.ogg:    Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps

Backticks erlauben es zwar, Kommandos zu verschachteln, aber Sie müssen einen verkehrten Schrägstrich, englisch Backslash, vor die inneren Backticks stellen, damit die Shell sie nicht als schließendes Element zum ersten Backtick ansieht. Spätestens noch eine Ebene tiefer gerät die Sache meist außer Kontrolle: Sie müssten dann den zweiten Backslash noch mit einem dritten Rückstrich maskieren.

Die schnelle Lösung hierfür lautet, das Konstrukt $(...) anstatt Backticks zu verwenden, da diese Variante durch unterschiedliche Zeichen am Anfang und Ende deutlich übersichtlicher ausfällt (Listing 5). Das Problem mit den Leer- und Sonderzeichen in Dateinamen sind Sie damit aber noch nicht los.

Listing 5

$ file $(find $(find . -name Podcasts -type d) -name '*.ogg')
./lang/Podcasts/dh-20130204-ausgabe-045.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps
./lang/Podcasts/dh-20130107-ausgabe-044.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps
./kurz/Podcasts/dh-20121015-kurz-018.ogg:    Ogg data, Vorbis audio, stereo, 44100 Hz, ~91840 bps

Xargs zur Rettung!

Das Umleiten der Ausgabe als Eingabe für einen anderen Befehl zu verwenden, ist viel einfacher, da das zweite Programm die Eingabe direkt verarbeitet. Xargs bietet also die schwierigere Variante zum Preis der einfacheren (Listing 6).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 02/2015 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: