Login
Login-Name Passwort


 
Newsletter
Werbung

Mo, 1. Januar 2001, 00:00

Shell-Workshop, Teil 2

Dateinamens-"Globbing"

Im Gegensatz zur DOS-Kommandozeile erledigt die Bash viele Aufgaben schon von selbst, anstatt diese den Kommandos zu überlassen. Beispielsweise werden Ausdrücke, in denen "Joker-Zeichen" wie * vorkommen, direkt expandiert, d.h. alle passenden Dateinamen werden eingesetzt. Das kann man daran sehen, dass

echo *

die Dateien und Verzeichnisse ausgibt, die im derzeitigen Arbeitsverzeichnis liegen, obwohl das Kommando "echo" - wie der Name bereits andeutet - lediglich dazu dient, die ihm übergebenen Argumente auszugeben.

Das ist der Grund, weshalb die folgenden beiden Kommandos nicht unbedingt immer eine identische Ausgabe erzeugen:

ls
ls *
Bild 2: So werden Dateien und Unterverzeichnisse von ls angezeigt

Wolfgang

Bild 2: So werden Dateien und Unterverzeichnisse von ls angezeigt

Wenn "ls" ohne Argumente aufgerufen wird, gibt es aus, was sich im aktuellen Verzeichnis befindet. Das * wird von der Bash durch alle Dateien und Verzeichnisse ersetzt und diese listet "ls" auf, allerdings wird statt dem Namen eines Verzeichnisses jeweils dessen Inhalt angezeigt. Das macht an sich Sinn, denn dadurch funktioniert beispielsweise

ls /usr/share/doc

wie gewünscht (es wird angezeigt, was sich in dem Verzeichnis befindet). Allerdings zeigt

ls */

dann eben auch nicht alle Verzeichnisse im Arbeitsverzeichnis an, sondern auch noch deren Inhalte (Siehe Bild 2). Unter anderem deshalb besitzt "ls" die Option "-d", die genau diesen Effekt verhindert. Um die Verzeichnisse anzuzeigen, benutzt man also

ls -d */

Das Kommando "ls" verfügt über zahlreiche Optionen. Um sich die gebotenen Möglichkeiten anzusehen, können Sie die Manual-Page von "ls" durch das Kommando "man ls" anzeigen lassen. Diese Vorgehensweise funktioniert bei den meisten Kommandos.

Zeichenklassen

Die Bash beherrscht neben den Jokerzeichen * (beliebige Zeichen eines Dateinamens) und ? (ein oder kein Zeichen in einem Dateinamen) auch noch sogenannte Zeichenklassen. Um die Ausgabe auf Dinge zu beschränken, die mit einem Buchstaben von a bis d beginnen, verwendet man

ls [a-d]*

Entsprechend gibt es auch negierte Zeichenklassen, die auf alle Zeichen passen, die darin nicht genannt sind. Ich hatte beispielsweise einmal folgendes Problem: Ich befand mich in einem Verzeichnis, in dem alle englischsprachigen Mini-HOWTOs lagen und wollte alle auflisten lassen; diese bestehen allerdings jeweils aus mehreren HTML-Dateien. Dabei hatet die Datei mit dem Inhaltsverzeichnis die Form "Name_des_HOWTOs.html" und die einzelnen Kapitel befanden sich in Dateien deren Namen die Form "Name_des_HOWTOs-Kapitelnummer.html" trugen (wobei "Kapitelnummer" eine Zahl ist). Da es recht viele Mini-HOWTOs gibt, war die Liste aller Dateien extrem lange. Zwar bietet Linux die Möglichkeit, per "Shift + Bild-oben" an der Konsole einige Bildschirmseiten nach oben zu blättern, doch das hätte in diesem Fall nicht gereicht für die fast 800 Dateien. Man könnte die Ausgabe per

ls * | less

an das Programm "less" weiterreichen, um sie vollständig betrachten zu können (allgemein ja eine gute Idee), doch ist es viel übersichtlicher, nur die Dateien anzeigen zu lassen, die vor dem ".html" keine Zahl haben, wozu man eben eine negierte Zeichenklasse verwenden kann. Diese sieht genauso aus wie eine nicht negierte Zeichenklasse, außer dass auf die öffnende eckige Klammer ein Zirkumflex folgt:

ls *[^0-9].html

Da die Namen aller HOWTOs glücklicherweise auf Buchstaben enden, hätte hier natürlich auch eine normale Zeichenklasse verwendet werden können (nämlich "[a-zA-Z]"). Die Text-Version der HOWTOs nachzuinstallieren wäre hier übrigens ebenfalls eine Möglichkeit gewesen, da diese nicht in mehrere Dateien unterteilt sind, aber die Zeichenklassen als Problemlösung führen wohl schneller zum Ziel.

An dieser Stelle sei eine allgemeine Anmerkung gestattet: Dateinamen anzeigen zu lassen ist sicherlich nicht spektakulär. Aber es ist deswegen nicht weniger nützlich. Und je mehr Möglichkeiten der Bash wir kennenlernern werden, desto spannender werden auch unsere Beispiele werden.

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung