パラメータ拡張を使用して「mkdir -p」のパラメータリストを生成する

パラメータ拡張を使用して「mkdir -p」のパラメータリストを生成する

私は次のようなものがあります:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

bar。下の各サブディレクトリの下にディレクトリを作成したいと思いますfoo

私がこれをしようとすると

% mkdir -p /tmp/foo/*/bar

...エラーが発生しました。

zsh: no matches found: /tmp/foo/*/bar

(振り返るとエラーの原因がわかります。)

zshforループを使用して元の問題を解決できることを知っていますが、単一の呼び出しに必要なパラメータを生成するパラメータ拡張形式のサポートがあるかどうか疑問に思いますmkdir -p。 IOW、パラメータ拡張は、「/bar拡張によって生成されたすべてのプレフィックスに追加する」と同じです/tmp/foo/*

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

答え1

setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

これは拡張ワイルドカードqユエットがいるグローバルロゴ使うグローバル予選ディレクトリのみ一致修飾子交換sの実行(%以下でのみ使用)歴史的代替モデルパターン)、各単語に文字列を追加します。

man zshexpn

答え2

もちろん - ループを使う

for n in /tmp/foo/*; do mkdir "$n/bar";done

glob はリストを拡張するために使用されます。既存のまだ作られていないプロジェクト。

答え3

ディレクトリが配列の場合は、${^...}拡張形式を使用できます。

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

答え4

@loa_in_はほとんどを持っていますが、パイピングfind出力はしばしば偽です。

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

関連情報