この mkdir コマンドは、bash をさらに拡張することで簡素化できますか?

この mkdir コマンドは、bash をさらに拡張することで簡素化できますか?

必要な次のディレクトリ構造を生成するコマンドがあります。

./sites
./sites/domain_co_uk
./sites/domain_co_uk/php
./sites/domain_co_uk/cgi
./sites/domain_net
./sites/domain_net/cgi
./sites/domain_com

これを作成するコマンドは次のとおりです:

mkdir -p sites/{domain_com,domain_co_uk/{cgi,php},domain_net/cgi}

私が疑問に思っているのは、これをさらに括弧で囲んでネストできるかどうかです。ドメイン_そしてそのCG-10 ...コマンド内で繰り返されないのですか?試してみたところ、不可能なようでしたが、イギリスそしてその_ネットcgi ディレクトリと php ディレクトリの両方がありましたが、_net に php ディレクトリは不要です。

bash のマニュアルページを読んでいるときに、パス名の展開は中括弧の展開の後に行われることに気づいたので、コマンドを簡略化できる何かを見逃しているのではないかと考えました。

私が持っているコマンドが必要なことを実行するので満足しています。これはむしろ知識拡張の状況です。

答え1

コマンドにはパス名の展開がありません。

どちらか一方を繰り返さないようにすることはできますが、両方を繰り返さないようにすることはできません。ない限り2 番目の拡張は、最初の拡張によって拡張されたすべてのドメインに対して同一にすることができます。拡張はすべての可能な組み合わせを列挙します。たとえば、{a,b,c}{1,2,3}常に 3×3 の文字列 (a1、a2、a3、b1、...) に拡張され、不要な値を除外することはできません。

両方のドメインに「cgi」があった場合そして「php」サブディレクトリの場合は、以下を使用できます。

mkdir -p sites/{domain_com,domain_{co_uk,net}/{cgi,php}}

中括弧の展開では、何に展開されるかは関係なく、境界でのみ使用する必要はないことに注意してください。元の例は次のように書き直すことができます。

mkdir -p sites/domain_{co_uk/{php,cgi},net/cgi,com}

または、逆にします(「cgi」の繰り返しを避けるため)。

mkdir -p sites/domain_{co_uk/php,{co_uk,net}/cgi,com}

しかし、一般的には、これは単純化しないコマンド(おそらく数学的な意味でのみ) – それは短くなるコマンドは理解しやすいですが、実際にはより複雑になります。より良いバージョンを以下に示します。

mkdir -p sites/domain_com
mkdir -p sites/domain_co_uk/{php,cgi}
mkdir -p sites/domain_net/cgi

関連情報