这个 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}

我想知道的是,我是否可以用更多的括号将其嵌套起来,以便领域_程序网关命令中没有重复吗?我试了一下,似乎不可能,我设法改变了它,这样_co_uk_网有 cgi 和 php 目录,但是我不想在 _net 中有 php 目录。

当阅读 bash 手册页时,我注意到路径名扩展发生在括号扩展之后,因此我想知道我是否错过了一些可以简化命令的东西。

我很高兴我所拥有的命令能够完成它需要做的事情,这更像是一种知识扩展的情况。

答案1

您的命令中没有路径名扩展。

你可以避免重复其中一个,但不能同时避免两者——除非第二次扩展可以与第一次扩展的所有域相同。扩展枚举所有可能的组合,例如,{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

相关内容