パラメータ展開を使用して「mkdir -p」の引数リストを生成する


10

私はこのようなものを持っています:

% 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

(後で見ると、エラーの理由を理解できます。)

forループを使用して元の問題を解決できることはわかっていますが、が1 zsh回の呼び出しで必要な引数を生成するパラメーター展開の形式をサポートしているかどうかを知りたいと思っていますmkdir -p。IOW、「APPENDと同等のパラメータ展開/bar膨張させることによって生成されたすべての接頭辞に/tmp/foo/*して得られました」、

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

回答:


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

これはされグロブて拡張ことがありquietのグロブフラグ使用グロブ修飾子を唯一のディレクトリと一致する修飾子を実行するs(使用ubstitution %でのみ利用可能であるパターン文字ヒストリ置換パターンの各単語に文字列を追加モード)。

man zshexpn

うわー、感動しました。私はあなたが指定したマニュアルページでそれをすべて見つけました。
ワイルドカード

1
オリジナルのポスターが指定されていることに注意してmkdir -pくださいbar。これらのディレクトリの一部にすでにサブディレクトリがある場合、エラーをスローしないというコマンドとは少し異なる効果があります。マイナーなポイントですが、ここで注目する価値があります。:)
ワイルドカード

1
もう一つの方法は、ビアアレイの拡張を使用することである${^spec}と追記bar何の各要素に/tmp/foo/*(/):に展開 set -- /tmp/foo/*(/)次いでmkdir -p -- "${^@}/bar"
don_crissti

5

もちろん-ループを使う

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

グロブは、まだ作成されていないものではなく、既存のアイテムのリストを展開するために使用されます。


申し訳ありませんが、私の質問は明確に述べられていません。明確にします。
kjo 2016年

2
これは、zshグロブを展開して単一の構文でテキストを追加できるかどうかには答えませんが、@ kjoがあなたが望むことを行う唯一の方法であると私は思います。
ワイルドカード

4

ディレクトリが配列内にある場合は${^...}、展開の形式を使用できます。

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

0

あなたは使用することができますfindし、xargsそれを行うには:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

これは-maxdepth 1、ターゲットのサブディレクトリ、およびそれ自体の-mindepth 1作成を使用および防止します。ディレクトリのみを考慮します。bar/tmp/footype d

echo実際のアクションを実行するには削除する必要があります。そうしないechoと、実行する行だけが出力されます。$()実行するように、代わりに囲むこともできます。

マニュアルは言うxargs -i非推奨、それはまだいくつかの年の仕事は...あなたは置き換えることができなければならないので、私は、他にも同様に便利な代替手段を発見されなかった-i-I'{}'する最新のものと。


この答えと次の答えは私にはよく見えます。誰かが反対票を投じるべき理由を誰かが説明できますか?反対票は問題ありませんが、理由がない場合、どうすれば学習できますか?
Joe

これは、OPが要求したこと以外は何もしない、機能する代替手段です。私を殴る。
loa_in_

答えには悪い答えがなければならないのはある種の偏見だと思うので、偏見が私の評判を損なうことにしました。
loa_in_

説明のつかない反対票は好きではありませんが、そのようなバイアスは見たことがありません。通常、「悪い」答え(私が理解するもの)は実際には悪いです。
Joe

0

@loa_in_はそれのほとんどを持っていましたが、パイプfind出力は偽のpasになる傾向があります。

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

xargs-exec代替手段のないさまざまなツールを使用するだけなので、すべてのツールで同じように機能するため、私のアプローチを使用します。
loa_in_
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.