Vou explicar exatamente qual é o problema do “*”.
Como você deve ter aprendido, o shell interpreta os argumentos antes de passá-los ao programa . Então, se você chamar em um shell algo como:
mplayer *.mp4
o shell converte isso para
mplayer abc.mp4 bdf.mp4 xxx.mp4
antes de chamar o mplayer.
(supondo que no diretório corrente os arquivos abc.mp4, bdf.mp4 e xxx.mp4 estejam presentes).
Portanto, o mplayer (ou qualquer outro programa, inclusive o java) nunca enxerga um parâmetro com “*” e sim os nomes destrinchados dos arquivos.
É também por isso que você tem de usar algo parecido com “find . -name *.java -print” ou coisa parecida, quando vai usar o “find”, porque só desse jeito (usando um “*”) você evita que o shell interprete o argumento antes de passar ao programa.
O “find” faz a busca por conta própria, em vez de reservar isso para o shell, porque ele precisa fazer uma busca recursiva e o shell não faz buscas recursivas.