CMD: *. * ou apenas *?

47

Na década de 1990, eu usava " *.* " para representar qualquer nome de arquivo no MS-DOS, mas eu vi mais scripts usando apenas " * " nos dias de hoje. Isso realmente faz alguma diferença em qual eu uso?

    
por Foebane 03.07.2017 / 12:05

2 respostas

65

O nome e a extensão do arquivo tem sido um campo único desde que o Windows 95 e o NT 3.5 introduziram o suporte ao "nome longo do arquivo" e as correspondências curinga são feitas para o nome do arquivo inteiro de uma só vez. Como resultado, você pode ter um nome de arquivo sem pontos (talvez raro para arquivos, mas muito comum para pastas / diretórios) e, à primeira vista, *.* não corresponderia realmente a tais arquivos.

Os scripts antigos que usam *.* ainda funcionarão devido ao código de compatibilidade - se o caractere curinga terminar com .* , essa parte será ignorado pelo sistema operacional. (Então, se você quisesse combinar especificamente arquivos com uma extensão, eu acho que você precisaria *.?* para isso.)

Mas não é algo em que você deva confiar; Se você estiver escrevendo scripts para versões modernas do Windows, siga suas convenções, não convenções do MS-DOS. (Observe que, a partir do Windows NT, os scripts .bat não são mais interpretados pelo MS-DOS, mas por cmd.exe , um programa nativo do Win32.)

No Linux e em vários outros Unixen, nome & extensão nunca foi separada em primeiro lugar, e não existe qualquer magia especial para fazer *.* funcionar, então * é a única escolha que faz sentido.

    
por 03.07.2017 / 12:23
11

Provavelmente vale a pena mencionar que as shells unixy / posixy como bourne shell, bash, ksh, zsh, etc. fazem a expansão de curinga (de caracteres glob como * , ? , [range] , [!range] e outras expansões como chaves e globs estendidas) para compilar uma lista de argumentos antes do comando é executado. Então essa expansão é feita pelo shell e não pelo comando para o qual estes podem ser argumentos.

i.e. O shell é responsável pelo que * , *.* expande para

 $ ls
 file.csv  file.doc  file.pdf  file.txt  file.xlsx  zz-file-without-extension

 $ (set -xv; foo *)   # is actually expanded to the following
   + foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension

 $ (set -xv; foo *.*)  # note this does not match 'zz-file-without-extension'
   + foo file.csv file.doc file.pdf file.txt file.xlsx

Este não é o caso no CMD (e semelhante para o powershell utilitários ) à medida que passa os caracteres glob para o comando executado - e, portanto, a expansão é de responsabilidade do comando / utilitário e não do shell. Então, finalmente, o que *.* ou * significa é deixado para o utilitário deixando-o em conformidade (ou não) com convenções - é por isso que os utilitários da CMD como dir *.* também combinaram arquivos (sem dúvida incorretamente preservando expectativas) sem extensões.

Eu acredito que seja seguro resumir dessa maneira.

  • No CMD, depende do utilitário.
  • No PowerShell, utilitários que fazem uso da WildCardPattern Class fornecerá um subconjunto consistente de comportamentos posixy.
por 03.07.2017 / 17:19