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.
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
mika am :
mika@grml /tmp % echo foo >| 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 %