zsh 再帰 glob からディレクトリ名を除外

zsh 再帰 glob からディレクトリ名を除外

私は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 は.svnNFS または Cygwin で少し遅いディレクトリに移動します。

再帰グローバル(またはより良い:任意パターン)から特定のディレクトリ名を除外する便利な(入力しやすい)方法はありますか?

答え1

Zshの拡張glob演算子は一致をサポートします/(kshとは異なり、zsh実装でも)。 Zshは(0回以上繰り返す)**/の短縮語です。だから私がしなければならないことはそれを(他のもの)に変えることです。(*/)#*/*^.svn.svn

print -l (^.svn/)#

整頓された!

答え2

options を使用してもワイルドカードはあまり良くありませんが、次のようにしてksh93取得できます。zshglobstarksh93

set -o globstar
FIGNORE='@(.|..|.svn)'
printf '%s\n' **/

関連情報