[Resolvido] Uso de asterisco

Pessoal,

Estou tentando usar o asterisco no meio do nome dos arquivos, pois não preciso especificar o nome inteiro para identificá-lo, por exemplo:

/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F1/1*.avi

Sendo que o nome do arquivo ai pode ser: 1xyz.avi

Quando vou montar a string para executar o video, entram mais duas variáveis inteiras que ficariam assim após as devidas substituições:

/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F1/1*.avi

Para executar, usei a seguinte linha:

Runtime.getRuntime().exec("/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F" + ind1 + "/" + ind2 + "*.avi");

Ele está executando aparentemente “certo”, mas o VLC retorna um erro que parece(da a entender) que o problema está sendo com o asterisco:

VLC is unable to open the MRL ‘file:///Users/usuario/arquivos/F1/1%2A.avi’.

Já tentei colocar no lugar do asterisco: //, / (este já da erro na compilação), e /u002A (Unicode) e persiste o erro.

Quando dou um print (System.out.println) na string ele a exibe conforme abaixo:

/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F1/1*.avi

e se eu coloco no terminal do MacOS, a execução ocorre.

Será que o problema está no VLC ou eu que estou colocando o asterisco errado ?
Alguém já passou por algo parecido?

Não é o programa VLC que interpreta os asteriscos e sim o shell. Chame o shell (não sei se o shell default do MacOSX é o /bin/bash ou se é algum outro) passando a opção -c para enviar a linha de comando completa.

Opa…obrigado pelas informações!

Então, no terminal ele executa normal o programa.

eu fiz um “ctrl+c” “ctrl+v” da linha no terminal:

/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F1/1*.avi

E ai o VLC abre normalmente…

É, porque o terminal executa o bash (ou outro shell) e ele é que interpreta os *.

Então o erro esta mesmo no meu código?
Digo, na montagem da string?

Vou dar um exemplo. Digamos que você queira executar o seguinte código:

ls -l /*

Como esse código tem um "" ele não pode ser executado diretamente pelo binário /usr/bin/ls. O shell (digamos que o shell usado seja o /bin/bash ) é que converte os * e interpreta os > , < e ~ . Normalmente você usa a opção -c. (Veja: http://www.gnu.org/software/bash/manual/bash.html#Invoking-Bash )
Portanto, para executar um ls -l /
,você usaria:

/bin/bash -c ‘ls -l /*’

(experimente executar o comando acima no seu terminal).

Tente a mesma coisa para o seu comando VLC, ou seja, mandar o /bin/bash chamar o VLC usando a opção -c.

Fiz o que pediu:

A linha de código ficou assim:

Runtime.getRuntime().exec("/bin/bash -c \"/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen /Users/usuario/arquivos/F" + temp + "/" + ep + "*.avi\"");

no caracter ", tentei também ’ (aspas simples/apóstrofo) e `(acento que indica a crase) , mas não executou. Assim, nem o VLC ele executa.

Quando coloco no terminal a saida abaixo que supostamente seria a saida da string acima, ele executa…

/bin/bash -c "/Applications/VLC.app/Contents/MacOS/VLC --play-and-exit --fullscreen -options /Users/usuario/arquivos/F1/1*.avi "

Esta estranho, e não estou conseguindo identificar de onde é o erro para poder agir! rsrs

Bom, fiz mais um teste e isolei um pouco mais o problema, ou seja, tirei o VLC da linha e comecei a testar somente com o comando mais básico, que é o ls.

O primeiro teste que fiz:

Process proc = Runtime.getRuntime().exec("/bin/bash -c 'ls'");

Executou com sucesso e me deu o retorno esperado.

O próximo acrescentei a estrutura de diretório:

Process proc = Runtime.getRuntime().exec("/bin/bash -c 'ls  /Users/usuario/arquivos/'");

Não executou, porém quando tirei o /bin/bash, exibe o retorno esperado:

Process proc = Runtime.getRuntime().exec("ls /Users/usuario/arquivos/");

No próximo teste coloquei o asterisco e não retornou nada também:

Process proc = Runtime.getRuntime().exec("/bin/bash -c 'ls  /Users/usuario/arquivos/*'");

e

Process proc = Runtime.getRuntime().exec("ls  /Users/usuario/arquivos/*");

Parece nesse caso que o problema esta sendo com o asterisco mesmo no metodo exec, ou estou vendo o erro de forma incorreta ainda?

Pessoal,

Consegui resolver, digo, achei a solução, implementei mas estou com outros problemas que ainda preciso estudar para entender o que eu fiz, pois fui colhendo informações na internet sobre o assunto.

Mas, para solucionar este problema, foi necessário usar o java.util.regex.

Então para verificar o padrão, ficou assim:

	String pattern = "1.*avi";

Só não vou colocar o código aqui, pois ainda esta “confuso” e preciso entender mais como está executando, mas basicamente fiz primeiro um comando para listar tudo o que tinha dentro do diretório(usando inputStream), com esta saída comparei o que tinha com o padrão que usei com o método “matcher” (java.util.regex.Matcher) e só com o nome do arquivo inteiro é que executei o comando, que neste exemplo era o de abrir o VLC.