拡張ファイル名からスキーマ接続配列を作成する

拡張ファイル名からスキーマ接続配列を作成する

次の改行を使用して、ファイル名生成パターンの拡張に参加する必要があります。

files=([^.]*(.U))
files=${(F)files}

または基本的に

files=$(find . -maxdepth 1 -type f -uid $EUID ! -name '.*' -exec basename '{}' \;)

zshを使って自分で行う方法を知りたいです。$filesスキーマを一度に拡張し、関連付けられた配列を文字列として割り当てるにはどうすればよいですか?

のような何十ものバリエーションを試しましたfiles=${(@F)${:-[^.]*(.U:wq)}}。頑張ったひもglob修飾子を使用しますが、files=([^.]*(.U^P:\\n:))別の単語(スペース2つ、$ IFSも変更してみました)を挿入して追加します。ひも最後の項目以降。結合修飾子があれば良いでしょう。

私は何を逃したことがありませんか?

ベストアンサー1

${(F)...}パラメータ拡張です。しかし、ネストされた拡張を許可

${...}代わりに型パラメータ式を使用する$(...)場合、または型コマンド置換を使用する場合名前上記では、最初に拡張し、結果をまるで拡張したかのように使用します。名前

ネストは、パラメータ拡張とコマンドのオーバーライドに制限されます。([^.]*(.U))どちらもありません。ファイル名生成で構成される配列定義の一部です。この場合、ファイル名の生成は行われません。パラメータ拡張が完了するまでは発生しません(ネストされたコマンド置換を除いて、ここでは特に便利ではありません)。これは以下で拡張されます。パラメータ拡張ルール:

各入れ子置換レベルで置換された単語は、コマンド置換、算術拡張、および~ファイル名拡張(先行合計など)を含む、すべての形式の単一単語置換(つまり、ファイル名の生成ではありません)を経ます=

そのため、これら2つを一緒に使用することはできません。次の外部ツールに依存せずにこれを実行するための組み込み方法が必要な場合は、findコマンドの置き換えでもまだ方法を提供できます。

files=$(print -lr -- [^.]*(.U))

おすすめ記事