私はLinuxでzshを実行していますsetopt extended_glob ksh_glob glob_dots
。私はコマンドラインに簡単に入力し、移植性の要件がないことを探しています。ソースツリーを見ていますが、「奇妙な」ファイル名はありません(例:\
ファイル名がないか、で始まるファイル名がありません-
)。
次のいずれかのコマンドは、現在のディレクトリのサブディレクトリのリストを再帰的に印刷します。
find -type d
print -l **/*/
これは実際にsvnチェックアウトです:
$ 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
.svn
各ディレクトリ内に存在するディレクトリとそのサブディレクトリを除外したいと思います。それは簡単ですfind
:
find -type d -name .svn -prune -o -print
短いzsh globでこれを行うことはできますか?ドットファイルの無視が完了しました(すでにglob_dots
設定しているので明示的に実行する必要があります)。
print -l **/*(/^D)
.deps
しかし、これは私が本当に見たいディレクトリを隠すので満足できません。以下を含むパスをフィルタリングできます.svn
。
print -l **/*~(*/|).svn(|/*)(/)
find
しかし、これは(それではzshを何に使用しますか?)より少し短いだけです。に短縮することもできますが、print -l **/*~*.svn*(/)
これにより名前付きディレクトリもフィルタリングされますhello.svn
。また、zsh は.svn
NFS または Cygwin で少し遅いディレクトリに移動します。
再帰グローバル(またはより良い:任意パターン)から特定のディレクトリ名を除外する便利な(入力しやすい)方法はありますか?
答え1
Zshの拡張glob演算子は一致をサポートします/
(kshとは異なり、zsh実装でも)。 Zshは(0回以上繰り返す)**/
の短縮語です。だから私がしなければならないことはそれを(他のもの)に変えることです。(*/)#
*/
*
^.svn
.svn
print -l (^.svn/)#
整頓された!
答え2
options を使用してもワイルドカードはあまり良くありませんが、次のようにしてksh93
取得できます。zsh
globstar
ksh93
set -o globstar
FIGNORE='@(.|..|.svn)'
printf '%s\n' **/