Skip to content

Tip #4: Globbing

Die zsh bringt einen äusserst mächtigen Mechanismus zum sog. Globbing, d.h. zur Ermittlung von Dateinamen, mit. Wie das funktioniert, will ich nun an einigen Beispielen demonstrieren:

Du hast in einem Projekt folgende Dateien angelegt:

kubijens@ppc210:~/TeXing/ > ls
file10.tex  file13.tex  file3.tex  file6.tex  file9.tex
file11.tex  file1.tex   file4.tex  file7.tex  Makefile
file12.tex  file2.tex   file5.tex  file8.tex  master.tex

Um vom Globbing der zsh zu profitieren, solltest du dies zuerst einschalten. Gib dazu die Zeile setopt extendedglob entweder direkt in die .zshrc oder in die Kommandozeile ein. Nun steht dir das erweiterte Globbing voll zur Verfügung.

Stell dir vor, du hast die obigen LaTeX-Dateien kompiliert. Dadurch sind dann eine Menge an .aux-, .log und .dvi-Dateien entstanden. Wenn du jetzt wissen willst, was außer den eigentichen LaTeX-Dateien denn sonst da ist, hilft das “^”. Dies neigert das ihm folgende Muster:

kubijens@ppc210:~/TeXing/ > ls ^*.tex
file10.aux  file12.aux  file1.aux  file3.aux  file5.aux  file7.aux  file9.aux
file10.dvi  file12.dvi  file1.dvi  file3.dvi  file5.dvi  file7.dvi  file9.dvi
file10.log  file12.log  file1.log  file3.log  file5.log  file7.log  file9.log
file11.aux  file13.aux  file2.aux  file4.aux  file6.aux  file8.aux  Makefile
file11.dvi  file13.dvi  file2.dvi  file4.dvi  file6.dvi  file8.dvi
file11.log  file13.log  file2.log  file4.log  file6.log  file8.log
kubijens@ppc210:~/TeXing/ > ls ^*.*  
Makefile

Eventuell kann es auch interessant sein, bestimmte Bereiche anzuzeigen:

kubijens@ppc210:~/TeXing/ > ls file<1-7>.tex 
file1.tex  file2.tex  file3.tex  file4.tex  file5.tex  file6.tex  file7.tex
kubijens@ppc210:~/TeXing/ > ls file<7->.tex
file10.tex  file11.tex  file12.tex  file13.tex  file7.tex  file8.tex  file9.tex

Richtig interessant wird es dann mit “**/”. Dieser veranlasst eine rekursive Suche. Dazu habe ich in der obigen Struktur drei Verzeichnisse mit jeweils weiteren Dateien angelegt:

kubijens@ppc210:~/TeXing/ > ls **/                                           
HTML/:
file10.html  file13.html  file3.html  file6.html  file9.html
file11.html  file1.html   file4.html  file7.html  file.html
file12.html  file2.html   file5.html  file8.html

PDF/:
file10.pdf  file12.pdf  file1.pdf  file3.pdf  file5.pdf  file7.pdf  file9.pdf
file11.pdf  file13.pdf  file2.pdf  file4.pdf  file6.pdf  file8.pdf  file.pdf

PS/:
file10.ps  file12.ps  file1.ps  file3.ps  file5.ps  file7.ps  file9.ps
file11.ps  file13.ps  file2.ps  file4.ps  file6.ps  file8.ps  file.ps
kubijens@ppc210:~/TeXing/ > ls **/file1*.*
file10.aux  file11.tex  file13.log        HTML/file11.html  PDF/file13.pdf
file10.dvi  file12.aux  file13.tex        HTML/file12.html  PDF/file1.pdf
file10.log  file12.dvi  file1.aux         HTML/file13.html  PS/file10.ps
file10.tex  file12.log  file1.dvi         HTML/file1.html   PS/file11.ps
file11.aux  file12.tex  file1.log         PDF/file10.pdf    PS/file12.ps
file11.dvi  file13.aux  file1.tex         PDF/file11.pdf    PS/file13.ps
file11.log  file13.dvi  HTML/file10.html  PDF/file12.pdf    PS/file1.ps

Ich denke, dass System ist einfach zu verstehen. Hinter dem Suchmuster kann man nun noch eine Art Vermerk machen und so die Treffer etwas einschränken. Ein Beispiel wäre, sich nur die Verzeichnisse anzeigen zu lassen. Hierzu musst du ls auch die Option -d mitgeben (-F für das Anhängen einen “/” an den Verzeichnisnamen kann u.U. auch sinnvoll sein):

kubijens@ppc210:~/TeXing/ > ls -d *(/)
HTML  PDF  PS Leer
kubijens@ppc210:~/TeXing/ > ls -dF *(/)
HTML/  PDF/  PS/ Leer/

Nur Verzeichnisse mit Inhalt anzeigen:

kubijens@ppc210:~/TeXing/ > ls -d *(F)
HTML  PDF  PS

Ausführbare Dateien (*) oder Einträge mit einem x-Bit (x) anzeigen:

kubijens@ppc210:~/TeXing/ > ls -d *(*)
file12.aux  file12.dvi  file12.log  file12.tex
kubijens@ppc210:~/TeXing/ > ls -d *(x)
file12.aux  file12.dvi  file12.log  file12.tex  HTML  Leer  PDF  PS

Es gibt hier noch zahlreiche weitere Parameter. Alle sind in der Manpage zshexpn im Abschnitt “Filename Generation” aufgeführt. Ich kann euch nur empfehlen, mal ein wenig damit herumzuspielen. Ihr werdet sehr schnell sehen, was für ein mächtiges Werkzeug ihr damit an der Hand habt.

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

mika on :

Wichtig ist aber, dass man auf das Quoting in der Kommandozeile aufpasst. Bsp:

mika@grml /tmp % echo foo &gt;| bar
mika@grml /tmp % grep ‘^foo$’ bar
foo
mika@grml /tmp % grep ^foo$ bar
1 mika@grml /tmp % setopt noextendedglob
mika@grml /tmp % grep ^foo$ bar
foo
mika@grml /tmp %

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
BBCode format allowed
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options
tweetbackcheck