zsh から glob 修飾子の範囲を制限します。

zsh から glob 修飾子の範囲を制限します。

私はこれがシェルで提供する方法ではないことをほとんど確信していますzshが、とにかくマニュアルに欠けていないことを確認するように尋ねると思いました。

シェルを使用すると、zsh次のパターンを使用してディレクトリに表示される最大2つのファイルを選択できます。

*(.OL[1,2])

一連のディレクトリがあり、各ディレクトリに最大2つのファイルが必要な場合は、個々のディレクトリを繰り返してから次のものを使用する必要があると思います。

$dirpath/*(.OL[1,2])

$dirpath現在のループ反復では、ディレクトリパスはどこにありますか?)

これは〜になりますいいね言える

*/*(.OL[1,2])

ただし、glob修飾子は一致する名前の完全なリストに適用され、各ディレクトリで2つではなく2つの一致を取得します。

質問:最も近いパスコンポーネントにのみ影響するように修飾子の「範囲」を制限できますか?

答え1

ループは必要ありません。中間変数で十分です。使用^パラメータ拡張刻印アレイに分散されます。

dirpath=(*(N-/))
print -rC1 -- $^dirpath/*(.NOL[1,2])

あるいは、一時変数を回避するために匿名関数を使用することもできます($argv/$@匿名関数パラメータになります)。

() {print -rC1 -- $^@/*(.NOL[1,2])} *(N-/)

答え2

別のアプローチは次のとおりです。

print -rC1 -- *(N-/e['reply=($REPLY/*(N.OL[1,2]))'])

ファイルリストをさらに返すために、xpression glob修飾子$replyに配列を設定できます。eしたがって、ここではディレクトリまたはシンボリックリンクのリストをグローバル化し、各ディレクトリに対して最大2つの一般的なファイルを返します。

e修飾子構文は、区切り文字以外の文字や、のようなペアをe:code:使用できるものです(使用することもできますが、、、、も引用符で囲む必要があります)。しかし、単語拡張は実際にはglob修飾子のどこでもセクションで行われます。たとえば、その中に変数を使用できるので大丈夫です。しかし、これが意味するのは、通常、内部単一引用符を入れる必要があるということです。 ~へ:e{code}e[code]e(code)e<code>()<>code*(L+$min_size)code防ぐズーム。

今(そして最近学んだ秘法です。:?)代わりにワイルドカード(、ペア*も含む[)の文字を]区切り記号として使用し、区切り文字を引用符の外に置くと、その文字が引用符なしの区切り記号は引用符の*ない他の区切り記号とのみ一致できるため*です。[]

したがって、unquotedで区切られた(引用符)コードで発生しても有効です*(N-/e['reply=($REPLY/*(N.OL[1,2]))'])。または他の区切り記号と一緒には機能しません。][...]:...:{...}

関連情報