Interpretação de *.*
em sistemas Windows / DOS antigos
O significado aqui está mais relacionado ao Windows / DOS do que ao Unix / Linux. Nos antigos sistemas Windows / DOS, era um padrão 'curinga'. Os padrões de caracteres curinga foram usados para corresponder nomes de arquivos de maneira semelhante aos globs do Unix. O curinga *.*
era comumente usado para corresponder a qualquer arquivo.
Assim como no Unix glob, o *
corresponderá a qualquer sequência de caracteres em um nome de arquivo, e *
por conta própria também corresponderá a qualquer arquivo. No entanto, o motivo pelo qual *.*
corresponderá a qualquer nome de arquivo também é devido a diferenças na maneira como esses caracteres curinga funcionam. De acordo com este artigo :
Any characters other than a dot that come after an asterisk have no effect, since the asterisk moves the cursor to position 12, at which point nothing changes the parse state except for a dot, which clears the last three positions and moves the cursor.
Esse comportamento (um pouco estranho da perspectiva Unix) significa que um ponto após um *
não corresponde realmente a um ponto, mas é apenas uma maneira rápida de permitir que você adicione mais caracteres ao padrão. Isso significa que adicionar outro *
corresponderá a qualquer coisa nessas três últimas posições.
Isso faz um pouco mais de sentido quando você considera que a sintaxe era usada em sistemas DOS e Windows anteriores ao Windows 95, o que exigia 8.3 nomes de arquivos . Esses nomes de arquivos só podiam ter um ponto e no máximo três caracteres após o ponto. A maioria, se não todos os arquivos no sistema, teria uma extensão de três caracteres (embora tecnicamente uma extensão menor ou nenhuma fosse permitida), então acho que fazia sentido usar *.*
para corresponder a qualquer arquivo (pelo menos de um Perspectiva lógica Windowsey).
Interpretação de *.*
em shells Unix
Em shells Unix, como outros apontaram, isso representa uma 'expansão de nome de caminho' ou 'glob'. O *
não tem nenhum salto estranho para o comportamento final e, portanto, não leva a caracteres após ele ser ignorado. O padrão *.*
corresponderá a qualquer nome de arquivo contendo um ponto (exceto no início). Definitivamente, isso não corresponderá a nenhum arquivo, pois há muitos arquivos em um sistema Unix / Linux que não possuem uma extensão (ou contêm um ponto, pois isso também é permitido).
O motivo para *.*
não corresponder a um ponto no início dos nomes de arquivo no Unix é porque colocar um ponto no início é como os arquivos são 'ocultos' e os arquivos ocultos são excluídos dos globs por padrão. Para combiná-los em um shell POSIX, um ponto precisa ser colocado explicitamente no início do padrão. Em bash
, a opção dotglob
shell pode ser definida ou a variável GLOBIGNORE
pode ser definida adequadamente, mas essa é outra questão!