
У меня есть команда для генерации следующей необходимой мне структуры каталогов:
./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}
Мне интересно, смогу ли я вложить это в дополнительные скобки так, чтобыдомен_иcgiне повторяются в команде? Я поигрался, и это не показалось возможным, мне удалось изменить это так, что оба_co_ukи_сетьбыли каталоги cgi и php, но мне не нужен каталог php в _net.
Читая страницу руководства 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