2015-09-14 50 views
0

我想創建一個鏈接,但我只知道文件夾名稱的第一部分。例如:Bash創建正則表達式/通配符鏈接

ln -s /root/v1.0.{?}/bin /usr/bin/myapp 

在上面我知道它有v1.0啓動,但不知道patch版本。我很好奇,如果可以建立像這樣的符號鏈接?

+1

這裏有一個可能的誤解:創建鏈接時可能使用通配符(請參見下面的答案),但通配符不會成爲鏈接的一部分 - shell將評估通配符,將現有版本傳遞給'ln -s',並且將會鏈接到該版本。如果稍後升級到更新版本,該鏈接仍將指向舊版本。 –

回答

3

我現在無法測試它,因爲我目前不在Linux系統上,但就我從bash的自動完成功能知道,ln -s /root/v1.0.*/bin /usr/bin/myapp應該做的伎倆 - 在前提下,只有一個文件夾與該通配符匹配。您可能需要考慮使用ln -sv而不是ln -s,這樣您就可以查看它是否有效,以及鏈接是否指向正確的位置。

+2

您可以使用普通的'?'而不是'*'作爲單位版本號。在Mac上用Bash 3.2播放'./name - {?}。c'',我會得到一些有趣的效果。使用'?',生成的名稱是'./name - {?}。c';用'./name - {?,@,=}。c',我得到'./name-1.c ./name-2.c ./[email protected] ./name - =。c' in我所在的目錄有'。/ name-1.c'和'。/ name-2.c'文件。那裏有奇怪的事情發生在那裏。我想我應該重新閱讀[括號擴展]上的Bash手冊(http://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion)_ [...繼續...] _ –

+2

_ [ ...繼續...] _有一個答案:_正確形成的括號擴展必須包含未加引號的開尾括號,並且至少包含一個未加引號的逗號或有效的序列表達式。任何不正確形成的大括號擴展都保持不變。因此,當有單個選項時,不能使用大括號。你至少需要一個逗號或者像'{1..10}'這樣的東西。 –

0

你的代碼是正確的,只是從它刪除大括號的一部分。 '?'是一個狂野的角色,它應該可以正常工作。提供您的目錄結構如下: /root/v1.0.0/bin /root/v1.0.1/bin 這將很好地工作,直到v1.0.9

LN -s /root/v1.0?/bin/usr/bin/myapp

但是,如果版本控制超過9,那麼您應該將wild字符改爲?到*

但如果你有特定的版本結構,它總是會是一個數字。 我寧願建議您使用以下

LN -s /root/v1.0.[0-9]*/bin在/ usr/bin中/ MYAPP

這將創建的myapp目錄的鏈接。

希望以後能幫到你。