如何在不实际使用通配符或 shell 扩展的情况下进入 foo-* 文件夹?

如何在不实际使用通配符或 shell 扩展的情况下进入 foo-* 文件夹?

短篇故事

我正在寻找输入第一个找到的foo-something目录的命令,例如:

cd foo-*

但不使用通配符(或其他特殊的 shell 字符)。

很长的故事

作为远程 drush 构建脚本的一部分,我试图找到输入文件夹名称可以更改的文件夹的方法,但它具有共同的前缀。相同的示例:drush -y dl adsdrush -y dl ads --dev下载ads-7.x-1.0-alpha1ads-7.x-1.x-dev)。

为了让事情变得更加棘手,该命令不能包含通配符或者转义分号,因为 drush 大量转义 shell 别名。

因此ls *会陷入错误ls '\''*'\'''并以错误告终Command ls '*' failed.

我也尝试过使用find,但我不能使用-execprimary,因为分号需要转义,并且 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,但是,你能用-execa结束你的+吗?

答案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 兼容的。

相关内容