Ich verwende zsh unter Linux unter setopt extended_glob ksh_glob glob_dots. Ich suche nach etwas, das einfach über die Befehlszeile ohne Portabilitätsanforderungen eingegeben werden kann. Ich betrachte einen Quellcodebaum ohne „seltsame“ Dateinamen (z. B. nein \in Dateinamen, kein Dateiname beginnend mit -).
Mit einem der folgenden Befehle wird die Liste der Unterverzeichnisse des aktuellen Verzeichnisses rekursiv gedruckt:
find -type d
print -l **/*/
Dies ist eigentlich eine SVN-Kasse:
$ find -type d
./.deps
./.svn
./.svn/text-base
./.svn/prop-base
./.svn/tmp
./.svn/tmp/text-base
./.svn/tmp/prop-base
./.svn/tmp/props
./.svn/props
./lib/.svn
./lib/.svn/text-base
./lib/.svn/prop-base
./lib/.svn/tmp
./lib/.svn/tmp/text-base
./lib/.svn/tmp/prop-base
./lib/.svn/tmp/props
./src/.svn
./src/.svn/text-base
./src/.svn/prop-base
./src/.svn/tmp
./src/.svn/tmp/text-base
./src/.svn/tmp/prop-base
./src/.svn/tmp/props
Ich möchte die .svnVerzeichnisse und ihre Unterverzeichnisse ausschließen, die in jedem Verzeichnis vorhanden sind. Es ist einfach mit find:
find -type d -name .svn -prune -o -print
Kann ich das mit einem kurzen zsh glob machen? Das Ignorieren von Punktdateien kommt nahe (ich muss es explizit tun, weil ich glob_dotsgesetzt habe):
print -l **/*(/^D)
Dies ist jedoch nicht zufriedenstellend, da es das .depsVerzeichnis verbirgt , das ich sehen möchte. Ich kann die Pfade herausfiltern, die Folgendes enthalten .svn:
print -l **/*~(*/|).svn(|/*)(/)
Aber das ist kaum kürzer als find(also wofür benutze ich zsh?). Ich kann es verkürzen print -l **/*~*.svn*(/), aber das filtert auch aufgerufene Verzeichnisse heraus hello.svn. Außerdem durchläuft zsh die .svnVerzeichnisse, was bei NFS oder Cygwin etwas langsam ist.
Gibt es eine bequeme (wie einfach zu tippende) Möglichkeit, einen bestimmten Verzeichnisnamen (oder noch besser: ein beliebiges Muster) in einem rekursiven Glob auszuschließen?
printf '%s\n' **/*oder zu schreibenprint -rl -- **/*?