短篇故事
我正在寻找输入第一个找到的foo-something
目录的命令,例如:
cd foo-*
但不使用通配符(或其他特殊的 shell 字符)。
很长的故事
作为远程 drush 构建脚本的一部分,我试图找到输入文件夹名称可以更改的文件夹的方法,但它具有共同的前缀。相同的示例:drush -y dl ads
或drush -y dl ads --dev
下载ads-7.x-1.0-alpha1
或ads-7.x-1.x-dev
)。
为了让事情变得更加棘手,该命令不能包含通配符或者转义分号,因为 drush 大量转义 shell 别名。
因此ls *
会陷入错误ls '\''*'\'''
并以错误告终Command ls '*' failed.
。
我也尝试过使用find
,但我不能使用-exec
primary,因为分号需要转义,并且 drush 是将其双重转义为 ( '\''\;'\''
)。
因此,如果可能的话,我希望在foo-*
不使用通配符(或任何其他特殊字符、参数扩展、命令替换、算术扩展等)的情况下输入文件夹。
我相信 shell 转义的逻辑是这里它的工作方式与escapeshellarg()
Linux 上的工作方式相同。它的作用是转义每个参数。
答案1
drush mung 是否有反引号和竖线?如果没有,你可以使用
cd `ls | grep foo- | head -n 1`
如果反引号不起作用,但是|
, $
,(
和)
do ,那么你可以将上面的更改为
cd $(ls | grep foo- | head -n 1)
如果|
不起作用,但是$
,(
并且)
做,那么你可以做
cd $(myprog)
其中myprog
是您编写的用于确定目录名称的脚本。
另外 - 我不明白你如何能够使用find
来帮助你做 a cd
,但是,你能用-exec
a结束你的+
吗?
答案2
您也可以尝试使用locate
实用程序,例如:
updatedb -o ~/tmp.db -l0 -U $PWD; cd $(locate -d ~/tmp.db -l 1 -b -r foo-)
对于更复杂的正则表达式模式检查info locate
。
答案3
基于最终要求你不需要cd
;您可以执行以下操作:
find . -type d -name 'foo-*' -exec make -C {} ';'
和
find . -type d -name 'foo-*' -exec phing -f {}/build.xml ';'
星号由内部处理find
,我相信这是 POSIX 兼容的。