2015-09-14 51 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目录的链接。

希望以后能帮到你。