
これら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
ません(他のものによって異なります)。ls
fakedir/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
設定することをお勧めします。強力ではありませんが、中かっこ拡張よりも優れています。extglob
zsh
zsh
特に(foo|bar)
s in に対応するのはbash -O extglob
is です@(foo|bar)
(この構文は ksh に由来する)。