`zsh`のグループディレクトリ

`zsh`のグループディレクトリ

これら2つのコマンドを使用すると、zsh同じ結果が生成されます。

ls (dir1|dir2)/dir3/*.txt
ls {dir1,dir2}/dir3/*.txt

bash次の作品のみを使用してください。

ls {dir1,dir2}/dir3/*.txt

.txtしたがって、複数の特定のディレクトリ内のすべてのファイルを一覧表示するには、上記のオプションのいずれかをzsh使用することをお勧めしますか、それとも正しいですか?それとも同じで、zsh不足している正規表現機能のみを提供しますかbash

ベストアンサー1

おそらく最初のバージョンを選択する必要があります。

(...)作成するように設計されたグローバルオペレータです。ファイル名、支柱の拡張と呼ばれている間は、{...}以下を生成するように設計されています。ひも。ほとんどの場合、ファイル名は文字列なので、2つを切り替えて同じ結果を得ることができますが、違いはほとんどありません。たとえば、存在しないディレクトリを考えてみます。この場合、次のような結果が得られます。

$ ls (dir1|fakedir)/dir3/*.txt
dir1/dir3/file.txt

$ ls {dir1,fakedir}/dir3/*.txt
zsh: no matches found: fakedir/dir3/*.txt

たぶん最初の結果が欲しいかもしれません。重要なのは、2番目のケースのエラーは中括弧拡張で発生することではありません*!削除するとアクセスできないと主張されるため、エラーを予測することはできls (dir1|dir1)/dir3ません(他のものによって異なります)。lsfakedir/dir3

別の違いは、最初のバージョンはディレクトリが重複している場合は1つの出力のみを生成し、2番目のバージョンは同じ出力を複数回生成することです。

$ ls (dir1|dir1)/dir3/*.txt
dir1/dir3/file.txt

$ ls {dir1,dir1}/dir3/*.txt
dir1/dir3/file.txt  dir1/dir3/file.txt

繰り返しますが、ほとんどの場合、ユーザーは最初の結果が欲しいと思います。

グロービングメカニズムを完全に制御するには、次の内容を理解することをお勧めします。グローバル予選(望むよりman zshexpn)。


その場合は、より多くのグローバル変数にアクセスできるオプションをbash設定することをお勧めします。強力ではありませんが、中かっこ拡張よりも優れています。extglobzsh

zsh特に(foo|bar)s in に対応するのはbash -O extglobis です@(foo|bar)(この構文は ksh に由来する)。

おすすめ記事