A diferença é que em bash
(como você marcou a pergunta) *
corresponde a qualquer string com comprimento zero ou mais caracteres, enquanto ?*
corresponde a uma string com pelo menos 1 caractere. Considere, por exemplo, dois arquivos: file.txt
e xfile.txt
e tente listá-los com ls ?*file.txt
ou ls *file.txt
.
Um cenário real quando uso essa construção é listar arquivos ocultos. Muitas vezes eu apenas faço
ls .??*
Os pontos de interrogação duplos estão aqui para impedir a listagem do diretório atual .
e do diretório pai ..
, como seria com uma forma mais simples ls .*
.
Eu preciso apontar aqui que meu .??*
não é perfeito; por exemplo, nomes de arquivos com apenas dois caracteres, como .f
, não correspondem a esse padrão. A solução mais confiável é ls {..?,.[!.]}*
, mas geralmente isso é muito para digitar para mim.