Diferença entre * e? * no Bash [closed]

6

* é aproximadamente um caractere curinga com uma quantidade ilimitada de comprimento. ? é aproximadamente um caractere curinga para um comprimento ou zero.

Existe uma diferença entre usar * vs ?* ao pesquisar strings em bash ? Eu vi os dois usados, e não posso envolver minha cabeça em torno das diferenças.

    
por TrevorKS 07.08.2018 / 23:04

2 respostas

15

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.

    
por 07.08.2018 / 23:12
6

De onde você tirou essa definição, de que tipo de expressão você se refere?

Se falamos de expressões shell, os dois caracteres podem ser usados sozinhos, mas a definição para ? não corresponde, pois sempre corresponde a um caractere e não a um ou zero.

Se falamos de expressões regulares, ambos são operadores colocados depois de uma expressão. Então, em "? *" Teria que ser colocado depois de outra coisa.

    
por 07.08.2018 / 23:12