web-dev-qa-db-ja.com

zshの辞書順のファイルの複数桁の範囲

グロビングにより、zshで2つの整数(2から57など)を使用して(辞書式順序で)ファイルの範囲を指定したいと思います。

例:「ファイル2〜57を辞書式順序で、グロビングパターンと一致するパスの下に選択します」。

角括弧を使用するとそれができると思いました

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

しかし、zshはどうやら私がファイルを要求していると考えている2から5(またはそのようなもの)の代わりにファイル2から57。何か考えはありますか?どうすればこれを達成できますか?

24

_[2-57]_は、zshおよびその他のすべてのワイルドカードと正規表現構文で、_2_、_3_、_4_、_5_および_7_で構成される文字セットです。そこに。グロブパターン_*[2-57]_は、最後の文字が5桁のいずれかであるすべてのファイル名に一致します。

_[m,n]_ glob qualifier の構文を覚えていないと思います。 Glob修飾子は常にパターンの最後に括弧で囲まれ、範囲区切り文字はコンマです。パターン*([2,57])は、2番目、3番目、…、57番目の一致に展開されます。デフォルトの展開順序は辞書式です(_numeric_glob_sort_オプションが設定されている場合、数値順に数値をソートする特別な魔法があります)。 oまたはOグロブ修飾子を使用して制御できます(たとえば、*(om[2,57])は、最新の1つのファイルを除く最新の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>_も数字と一致する可能性があるため、_*_のようなパターンは期待どおりに動作しない可能性があります。たとえば、_file58_は_*<2-57>_に一致し、_file5_は_*_部分に一致し、_8_は_<2-57>_部分に一致します。パターン_*[^0-9]<2-57>_はこの問題を回避します。

しかしzshはどうやら私がファイル2から57の代わりにファイル2から5(またはそのようなもの)を求めていると考えているようです。

[]括弧は、数学的に解釈されるnumbersではなく、一致する文字(数字でもかまいません)のリストを示します。このようなパターンは、単一文字と照合されます。リストには範囲を含めることができますが、数字または文字の範囲を含めることができます。 [2-57]マッチは "2から5の範囲のすべての数字and a 7"に展開されます。

2から57までの数値に一致させるには、グロビングパターンの代わりに(またはそれと一緒に)シーケンス式を使用する方が簡単です。

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

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

6
rozcietrzewiacz