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 .svn
Verzeichnisse 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_dots
gesetzt habe):
print -l **/*(/^D)
Dies ist jedoch nicht zufriedenstellend, da es das .deps
Verzeichnis 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 .svn
Verzeichnisse, 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 -- **/*
?