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


24

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

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

角かっこを使用するとそれができると思った

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

しかし、zshのはどうやら私は、ファイルを求めています考えている25(またはそのような何か)の代わりに、ファイル257。なぜ考えますか?どうすればこれを達成できますか?

回答:


30

[2-57]なる文字セットである2345そして7、そこのzshや他のすべてのワイルドカードや正規表現構文インチ globパターン*[2-57]は、最後の文字がこれらの5桁のいずれかであるすべてのファイル名と一致します。

[m,n] glob修飾子の構文を誤って覚えていると思います。グロブ修飾子は、常にパターンの最後に括弧で囲み、範囲区切り記号はコンマです。パターン*([2,57])は、2番目、3番目、…、57番目の一致に展開されます。デフォルトの展開順序は辞書式です(numeric_glob_sortオプションが設定されている場合、数値を数値順に並べ替える特別な魔法があります)。oまたはOglob修飾子で制御できます(たとえば*(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>はこの問題を回避します。


あなたが正しいです。glob修飾子を思い出していました。慎重な説明をありがとう。
アメリオバスケスレイナ

ちなみに、この声明では少し混乱しましたif you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression。ファイルが存在せず、一致するものがない場合、ブレース展開はどのように展開するかを知るのでしょうか?(グロブ修飾子とはどのように拡張しますか?)
アメリオバスケスレイナ

2
@intrpc foo{8..11}barはに展開されfoo8bar foo9bar foo10bar foo11barます。このビット拡張は、ファイル名とは無関係です。同様に、にfoo{eight,nine,ten,eleven}bar展開しfooeightbar fooninebar footenbar fooelevenbarます。これは、ksh / bash / zshのブレース展開です。
ジル 'SO-悪であるのをやめる'

6

しかし、zshは、ファイル2〜57ではなく、ファイル2〜5(またはそのようなもの)を要求しているようです。

ので[]、ブラケットがマッチしたのリストを示す文字(数字可能)、ない数字が数学的に解釈します。このようなパターンは、単一の文字と照合されます。リストには範囲を含めることができますが、数字または文字を含めることができます。[2-57]matchは、「2〜5 および 7の範囲のすべての数字」に展開されます。

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

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

編集:しかし、これは残念ながら、リストされたすべてのファイルの辞書順を示しません-それらはシェル拡張のために一般的な数字の末尾でグループ化されます。


ありがとう@rozcietrzewiacz!私はそれについて考えるべきだった。私のファイルには、私が思った瞬間のために、それらの数値を持っていた[]。..順序で物事を印刷した
アメリオバスケス・レイナに

あなたの説明[2-57]は正しいですが、私は{2..57}(それがあなたの意図でしたよね?)intrpcがやりたいこととは関係ないと思います。
ジル 'SO-悪であるのをやめる'

編集してくれてありがとう(寝る時間だと思う)。そして、あなたは正しいです-私は辞書編集順序の部分を忘れていました。
rozcietrzewiacz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.