Como se chama o símbolo *. *?

12

Qual é o nome para o

*.*

símbolo e qual é o seu significado?

les
fonte

Respostas:

20

Interpretação de *.*sistemas Windows / DOS antigos

O significado aqui está mais relacionado ao Windows / DOS do que ao Unix / Linux. Nos sistemas Windows / DOS antigos, era um padrão 'curinga'. Os padrões curinga foram usados ​​para combinar nomes de arquivos de maneira semelhante aos globs do Unix. O *.*curinga era comumente usado para corresponder a qualquer arquivo.

Assim como ocorre com um glob Unix, *ele corresponderá a qualquer sequência de caracteres em um nome de arquivo, por *si só também corresponderá a qualquer arquivo. No entanto, o motivo pelo qual *.*também corresponderá a qualquer nome de arquivo é devido a diferenças na maneira como esses curingas funcionam. De acordo com este artigo :

Qualquer caractere que não seja um ponto que vem após um asterisco não tem efeito, pois o asterisco move o cursor para a posição 12; nesse ponto, nada altera o estado de análise, exceto um ponto, que limpa as três últimas posições e move o cursor.

Esse comportamento (um pouco estranho da perspectiva do Unix) significa que um ponto após a *na verdade não corresponde a um ponto, mas é apenas uma maneira imprudente 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 foi usada no DOS e nos sistemas Windows antigos anteriores ao Windows 95, que exigiam nomes de arquivos 8.3 . Esses nomes de arquivos só podem ter um ponto e no máximo três caracteres após o ponto. A maioria, se nem todos os arquivos no sistema tivessem uma extensão de três caracteres (mesmo que tecnicamente uma extensão mais curta ou nenhuma fosse permitida), então, de alguma forma, acho que fazia sentido usar *.*para corresponder a qualquer arquivo (pelo menos da perspectiva lógica do Windowsey distorcida) )

Interpretação de *.*shells em Unix

Nos shells do Unix, como outros já apontaram, isso representa uma 'expansão de nome de caminho' ou 'glob'. O *comportamento não tem nenhum salto estranho para o final e, portanto, não leva os caracteres a serem ignorados. *.*O padrão corresponderá a qualquer nome de arquivo que contenha 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 têm extensão (ou contêm um ponto, pois isso também é permitido).

A razão para *.*não combinar um ponto no início dos nomes de arquivos 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 explicitamente colocado no início do padrão. bashNa dotglobopção de shell pode ser definido ou a GLOBIGNOREvariável pode ser definida de forma adequada, mas isso é outra questão!

Graeme
fonte
1
Note-se que as versões atuais do Windows parecem se comportar de maneira mais lógica. Em particular, "Qualquer caractere que não seja um ponto que vem depois de um asterisco não tem efeito" não é mais verdade; pelo menos ao filtrar arquivos em uma caixa de diálogo Abrir arquivo padrão no Windows 7 pelo padrão *7.*, obtenha todos os arquivos cujo último caractere antes da extensão seja 7e *sa*, com , recebo todos os arquivos que contêm a substring saem qualquer lugar do arquivo e assim por diante. (Assim, o artigo que você cita é intitulado Como fez wildcards trabalhar no MS-DOS ? (Ênfase acrescentada por mim).)
OU Mapper
1
O @ORMapper atualizou os cabeçalhos para refletir isso. Esse comportamento é anterior ao Windows 95, que está na resposta (embora o cabeçalho fosse enganoso).
Graeme
11

Está globno bash, Abaixo citei o manual do bash:

bash - GNU Bourne-Again SHell

*

Corresponde a qualquer sequência, incluindo a sequência nula. Quando a opção de shell globstar está ativada e *é usada em um contexto de expansão de nome de caminho, dois adjacentes *susados ​​como um único padrão correspondem a todos os arquivos e zero ou mais diretórios e subdiretórios. Se seguido por a /, dois adjacentes *scorresponderão apenas a diretórios e subdiretórios.

Nesse caso, *.*corresponda a qualquer arquivo que contenha um ponto .em seu nome.

Você pode ver mais detalhes aqui .

cuonglm
fonte
8

O asterisco *é uma globlinguagem shell. Citando a partir da linguagem de comando do Shell :

O asterisco ( '*') é um padrão que deve corresponder a qualquer sequência, incluindo a sequência nula.

No entanto, ele não corresponde aos nomes de arquivos que começam com a .menos que a opção shell dotglobesteja definida.

Quando você usa *.*, corresponde a qualquer coisa que:

  • não começa com um .
  • contém pelo menos um .

Você também pode consultar a Expansão do nome do arquivo no manual.

devnull
fonte
6

Muitas pessoas vindas do Windows acham que *.*é para todos os arquivos. No Windows, é. No UNIX, são todos os arquivos que contêm pelo menos 1 ponto em seu nome. *por si só funciona muito bem no Windows (desde o início do DOS); no entanto, os livros antigos publicaram *.*e parece ser um hábito difícil de romper.

Joshua
fonte
4

*é um curinga usado pelo shell para executar a expansão do nome do arquivo , também conhecido como "globbing". *expande para qualquer coisa, incluindo nada (por exemplo, *.*corresponderá file.etc.). O outro curinga comum é o ?que corresponde a qualquer caractere único.

Não confunda a função desses curingas com o uso dos mesmos caracteres em expressões regulares (como aquelas usadas com grep).

Cachinhos Dourados
fonte
3

Isso é estrela-ponto-estrela - pelo menos no mundo do DOS (e mais tarde, é claro, do Windows). No DOS, o ponto .tem um significado mágico especial, porque os nomes de arquivos têm uma base de oito caracteres (posteriormente estendidos, mas vamos continuar à moda antiga) e uma extensão de três caracteres (que definiu o tipo de arquivo). No Unix, o tipo de arquivo geralmente é definido pelos dois primeiros bytes do arquivo (ou outra mágica), e a extensão é informativa, mas não tem muito significado. Exceto quando tudo ficar embaçado.

Portanto, no Unix, não há significado especial. O asterisco é um caractere "globbing" nos shells do Unix e é um curinga para qualquer número de caracteres (incluindo zero). ?é outro personagem globbing comum, correspondendo exatamente a qualquer personagem.

*.*corresponde a qualquer nome de arquivo que contenha pelo menos um .. Ele não tem um nome especial ou qualquer significado além de *a*ou *_*. E *.?corresponderia a qualquer arquivo com um ponto e exatamente um caractere após esse ponto. Existem também alguns padrões de globbing estendidos mais complicados - consulte a página de manual do seu shell.

O "New Hacker's Dictionary" (uma expansão do antigo "Jargon File" do MIT) observa que "estrela" é o nome mais comum para o *símbolo (seguido por splat), e acho que isso ainda é verdade na prática e .é definitivamente comum " ponto ", portanto, embora não tenha nenhum significado especial intrínseco como símbolo conglomerado, a sequência ainda é razoavelmente chamada estrela-ponto-estrela no Unix. (É apenas menos útil.)

mattdm
fonte
Isso pode parecer estranho, mas obrigado por mencionar "estrela ponto estrela", foi o que tornou esta página googleable!
Score_Und
3

Aqui existem 2 símbolos, asterisco *e ponto .. As conchas normalmente apenas interpretam o asterisco como qualquer caractere, mas, em regex, isso significaria um globo ganancioso. Nesse caso, seria compatível com qualquer coisa que não termine ou comece com um ponto, mas contenha pelo menos um:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
Braiam
fonte
1
Seu onlydotatend.caso é uma partida, com certeza?
Graeme
@Graeme nope. touch 'onlydotatend.' && echo *.*não retorná-lo
Braiam
1
Faz por mim! Em ambos bashe dash. Qual shell você está usando?
Graeme
@ Graeme zsh, e você está certo bash não.
Braiam
Eu apenas tentei isso em uma zshconfiguração de baunilha e funciona lá também. Eu não entendo como onlydotatend.não pode ser uma correspondência, existe uma opção de configuração que faz isso?
Graeme