Como inserir a pasta foo * sem realmente usar extensões curinga ou shell?

1

História curta

Estou procurando o comando para inserir o primeiro diretório foo-something encontrado, como:

cd foo-*

mas sem usar curinga (ou outros caracteres de shell especiais).

Longa história

Como parte do script de criação do drush remoto, estou tentando encontrar a maneira de inserir a pasta que o nome da pasta pode alterar, mas ele tem um prefixo comum. Mesmo exemplo: drush -y dl ads ou drush -y dl ads --dev faz o download de ads-7.x-1.0-alpha1 ou ads-7.x-1.x-dev ).

Para tornar as coisas mais complicadas, o comando não pode consistir em curinga ou ponto e vírgula com escape , porque o drush está escapando strongmente dos aliases do shell.

Portanto, ls * é salvo em ls '\''*'\''' e termina com Command ls '*' failed. error.

Eu também tentei usar find , mas não consigo usar -exec primary, porque ponto e vírgula precisa ser escapado , e drush é o dobro de escape em ( '\''\;'\'' ).

Portanto, estou procurando inserir a pasta foo-* sem usar curinga (ou qualquer outro caractere especial, expansão de parâmetro, substituição de comando, expansão aritmética etc.), se possível.

Acredito que a lógica do shell escape é aqui e destina-se a funcionar da mesma forma que escapeshellarg() faz no Linux. O que ele faz é escapar de cada parâmetro.

    
por kenorb 17.10.2014 / 22:18

3 respostas

0

Drush backshks mung e barras verticais? Se não, você poderia usar

cd 'ls | grep foo- | head -n 1'

Se os backticks não funcionarem, mas | , $ , ( e ) do, você poderá alterar o acima para

cd $(ls | grep foo- | head -n 1)

Se | não funcionar, mas $ , ( e ) do, você poderá fazer

cd $(myprog)

onde myprog é um script que você escreve para determinar o nome do diretório.

Além disso, não entendo como você pode usar find para ajudar você a fazer um cd , mas, você pode terminar seu -exec com um + ?

    
por 17.10.2014 / 23:51
0

Você também pode tentar usar locate utility, por exemplo:

updatedb -o ~/tmp.db -l0 -U $PWD; cd $(locate -d ~/tmp.db -l 1 -b -r foo-)

Para um padrão de regex mais complexo, verifique info locate .

    
por 18.10.2014 / 20:01
0

Com base no requisito final você não precisa de cd ; você pode fazer o seguinte:

find . -type d -name 'foo-*' -exec make -C {} ';'

e

find . -type d -name 'foo-*' -exec phing -f {}/build.xml ';'

Os asteriscos são manipulados por find internamente e acredito que isso é compatível com POSIX.

    
por 18.10.2014 / 10:19