zshの辞書シーケンスマルチビットファイル範囲

zshの辞書シーケンスマルチビットファイル範囲

globbingでは、zshから2つの整数(2〜57など)でファイル範囲(事前順)を指定したいと思います。

例:「特定のワイルドカードパターンに一致するパスの下にアルファベット順にファイル2〜57を選択します。」

角かっこを使うと効果があると思います。

 for x in /foo/bar/*[2-57]; do print $x; done

しかし、zshは明らかに2私が。どんなアイデアがありますか?どうすればいいですか?5257

答え1

[2-57]23、、、、4および5zshの7他のすべてのワイルドカードおよび正規表現構文で構成される文字セット。グローバルパターンは、*[2-57]最後の文字がこの5つの数字のいずれかであるすべてのファイル名と一致します。

構文を誤って覚えていると思います。[m,n] グローバル予選。グローバル修飾子は常にパターンの末尾の括弧内に配置され、範囲区切り文字はカンマです。モードは*([2,57])2次、3次、… 、57次戦まで拡張される。デフォルトの拡張順序は辞書式の順序です(numeric_glob_sortこのオプションが設定されている場合は、いくつかの特別な魔法を使用して数字を数字で並べ替えます)。oまたは、Oglob修飾子を使用してこれを制御することもできます(たとえば、最新*(om[2,57])の57ファイルのうち最初のものではなくファイルと一致する)。 。

for x in /foo/bar/*([2,57]); do print $x; done

要求されたものではありませんが、将来の読者に関連していて役に立つかもしれません。存在するかどうかにかかわらず、ファイル2〜57を列挙するには、次の範囲を使用できます。中かっこ表現。この機能はbashとkshにも存在します。

echo hello{2..57}

名前に2から57の数字を含むファイルを一致させるには、パターンを使用できます<2-57>。これはzsh専用です。

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

数字も一致する可能性があるため、同様のパターンが期待どおりに機能しない可能性が*<2-57>あります。*たとえば、file58match *<2-57>file5match *part、8match <2-57>part などがあります。このモードは*[^0-9]<2-57>この問題を防ぎます。

答え2

しかし、zshは明らかに私はファイル2〜57の代わりにファイル2〜5(または同様のもの)を要求すると思います。どんなアイデアがありますか?

[]角かっこは一致項目のリストを表すため数値(数字かもしれません)数字数学的に説明してみてください。このモデルは以下に関連しています。一つ特徴。リストには範囲を含めることができますが、数字または文字も含めることができます。[2-57]試合は次に拡大します。「2~5の範囲のすべての数そして7インチ。

2 から 57 までの数字を一致させるには、次のようにします。配列表現ワイルドカードパターンの代わりに(またはそのようなパターンと共に):

for x in /foo/bar/*{2..57}; do print $x; done

編集する: しかし、残念ながら、これはリストされたすべてのファイルの辞書式の順序を提供しません。シェル拡張のため、共通の数字の末尾にグループ化されます。

関連情報