ftblog

:: widerstand zwecklos ::
email jabber gpgkey
hackergotchi

September 15, 2005

Tooltime: zsh #3

Filed under: tooltime -- 14:11

zsh Globbing - The Art of Selecting Files

Ich habe es ja schon angepriesen: Das Globbing der Z-Shell
Die irre Mächtigkeit dieser Allzweckwaffe macht find(1) fast redundant.

Erstmal einschalten:

% setopt extendedglob
Was kann man nun damit anstellen?
Ein Beispiel:

Auf meinem Laptop habe ich die Konfiguationsdateien meines Users
in dessen Homeverzeichnis unter $HOME/etc/ abgelegt.
Meine 'vim' Konfiguration liegt nun in '/home/hawk/etc/vim/'.
Dann habe ich mir ein Perlskript dazu geschrieben, welches symbolische
Links in meinem Homeverzeichnis organisieren kann.

Um mir die erzeugten Links anzusehen mache ich folgendes:

% ls -l .*(@)
und bekomme: (Ausgabe gekürzt!)

lrwxrwxrwx 1 hawk hawk 20 Aug 28 18:38 .abook -> /home/hawk/etc/abook
lrwxrwxrwx 1 hawk hawk 23 Aug 28 18:38 .aptitude -> /home/hawk/etc/aptitude
lrwxrwxrwx 1 hawk hawk 28 Aug 28 18:38 .aumixrc -> /home/hawk/etc/aumix/aumixrc
lrwxrwxrwx 1 hawk hawk 20 Aug 28 18:38 .gnupg -> /home/hawk/etc/gnupg
lrwxrwxrwx 1 hawk hawk 22 Aug 28 18:38 .hotkeys -> /home/hawk/etc/hotkeys
lrwxrwxrwx 1 hawk hawk 25 Aug 28 18:38 .imapfilter -> /home/hawk/etc/imapfilter
lrwxrwxrwx 1 hawk hawk 20 Aug 28 18:38 .irssi -> /home/hawk/etc/irssi
lrwxrwxrwx 1 hawk hawk 19 Aug 28 18:38 .lftp -> /home/hawk/etc/lftp
lrwxrwxrwx 1 hawk hawk 21 Aug 28 18:38 .muttng -> /home/hawk/etc/muttng

_Ja_, auf diese Art und Weise zeigt mir ls nur symbolische Links an.
Das ist ein recht primitives Beispiel, aber doch sehr nützlich.
Selbstverständlich kann man die Auswahl nicht nur auf Links begrenzen.

Die zsh kann auch rekursiv Dateinamen basteln, ein Beispiel?

% for i in **/*.gif; convert $i $i:r.png
Das macht aus *.gif hübsche *.png.
Wie funktioniert's?
Ganz einfach: '**/*.gif' macht eine Liste mit allen gifs im aktuellen
Verzeichnis und allen Unterverzeichnissen. Und for packt diese der Reihe nach
in die Variable '$i' und führt darauf ein Kommando aus. Man beachte, dass man
bei der zsh (bei einfachen Schleifen) das 'do ... ; done' um den Befehlsblock
fallen lassen kann.

In dem von for aufgerufenen Kommando kommt nun ein sog. Modifier zum
Einsatz (:r). Was macht der? Er nimmt das vorangehende Wort, schneidet
die Dateiendung ab, und liefert den Basisnamen zurück.

Anderes Beispiel:
Man will alle Unterverzeichnisse eines Baumes für alle Nutzer eines
Systems betret- und lesbar machen, für Besitzer und Gruppe zusätzlich noch
schreibbar:

% chmod 0775 **/*(/)
... und fertig, man bekommt auch keine 1000 ausführbaren Dateien, weil man mit
'(/)' das Globbing auf Verzeichnisse beschränkt.
Wenn nun die Dateien die gleichen Rechte, ausser dem executable Flag haben
sollen macht man:

% chmod 664 **/*(.)
Oder nur "world-readable" Dateien anzeigen:

% ls -la **/*(R)
Oder *.cpp, *.o und *.h anzeigen:

% ls *.(cpp|o|h)
Oder alle leeren Verzeichnisse in einem Baum suchen:

% ls -ld **/*(/^F)
Was ich mit den Beispielen zeigen will:
Das Globbing der zsh ist _sehr_ mächtig. Dabei bleibt es aber einfach zu
handhaben. Selbstverständlich kann man damit viel grauenhafteres anstellen:

% c=(*.c) o=(*.o(N)) eval 'ls ${${c:#(${~${(j:|:)${o:r}}}).c}:?done}'
Was das macht, kann man da nachlesen wo ich es gefunden habe:
zsh-lovers.1 als html Dokument

Eine genaue Beschreibung will und muss ich an dieser Stelle nicht schreiben,
denn wer es genau wissen will liesst einfach die Manualpage 'zshexpn(1) - zsh
expansion and substitution'.

Ich habe hier nur eine Hand voll Möglichkeiten wiedergegeben, in Wirklichkeit
gibt es zig Globbing Flags und Modifiers so das es für die allermeisten
Probleme eine einfache Lösung gibt.

Wer die obengenannte zsh-lovers manpage gelesen hat, wird bemerken, das sich
dort einige der genannten Beispiele wiederfinden. Das liegt daran, dass sie
so schön Lösungen für Alltagsprobleme demonstrieren und auch daran, dass es
schwer ist sich originelle Beispiele aus den Fingern zu saugen. :-)

Einfach etwas damit spielen, dann kriegt man den Dreh schnell raus.

Viel Spass.

Powered by zblog
valid css | valid xhtml | utf-8 encoded | best viewed with anybrowser