
我有一個命令來產生我需要的以下目錄結構:
./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