Nos anos 90, eu usaria " *.*
" para representar qualquer nome de arquivo no MS-DOS, mas vi mais scripts usando apenas " *
" atualmente. Realmente faz alguma diferença qual deles eu uso?
command-line
Foebane
fonte
fonte
*
e*.*
agora são equivalentes paracmd
comandos internos e utilitários de linha de comando modernos, alguns utilitários mais velhos que usam parâmetros de máscara de arquivo podem usar as funções correspondentes arquivo mais velhos, e para eles as máscaras não será equivalente.*.*
token não deve retornar arquivos sem extensão.*.*
não deve retornar arquivos sem extensão. Infelizmente sim. Veja a resposta do Grawity.Respostas:
O nome e a extensão do arquivo têm 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 no 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 corresponda a esses arquivos.Scripts antigos usando
*.*
irá ainda trabalho por causa do código de compatibilidade - se as extremidades curinga com.*
, essa parte é ignorada pelo sistema operacional. (Portanto, se você deseja corresponder especificamente arquivos com uma extensão, acho que precisaria*.?*
disso.)Mas não é algo em que você deva confiar; se você estiver escrevendo scripts para versões modernas do Windows, siga as convenções, não as convenções do MS-DOS. (Observe que, no Windows NT, os scripts .bat não são mais interpretados pelo MS-DOS, mas por
cmd.exe
um programa Win32 nativo.)No Linux e em vários outros Unixen, nome e extensão nunca foram separados em primeiro lugar, e não há mágica especial para fazer o
*.*
trabalho, por isso*
é a única opção que faz sentido.fonte
*
corresponderia apenas aos nomes de arquivos sem uma extensão. A maneira 'segura' de ser compatível com ambos era usar**
.*
( por padrão ) não corresponde aos nomes de arquivos ocultos (começando com a.
).É provavelmente vale a pena mencionar que o UNIXy / conchas posixy como shell Bourne, bash, ksh, zsh, etc fazer expansão curinga (de caracteres glob como
*
,?
,[range]
,[!range]
e outras expansões como chaves e globs estendidos) para compilar uma lista de argumentos antes de o comando É executado. Portanto, essa expansão é feita pelo shell e não pelo comando ao qual esses argumentos podem ser discutidos.ou seja, o shell é responsável pelo quê
*
,*.*
expande paraEsse não é o caso no CMD (e da mesma forma para os utilitários do PowerShell ), pois ele passa os caracteres glob literalmente para o comando executado - e, portanto, a expansão é de responsabilidade do comando / utilitário e não do shell. Então, em última análise, o que
*.*
ou o*
meio é deixado para o utilitário, deixando-o em conformidade (ou não) com as convenções - e é por isso que os utilitários do CMDdir *.*
também combinam (sem dúvida incorretamente, mas preservam as expectativas) os arquivos sem extensões.Eu acredito que é seguro resumir dessa maneira.
fonte
FindFirstFile
em si é o modo de usuário (o kernel32.dll e o ntdll.dll são bibliotecas no modo de usuário - faz parte do subsistema Win32, não do kernel), mas na verdade não faz muito.mmv "fred.*" "tom.#1"
. (A substituição usa em#1
vez de*
, o que tem a vantagem de permitir que você reordene os campos).mmv
não é instalado por padrão na maioria dos sistemas, mas outras ferramentas de renomeação em lote geralmente são. Consulte este artigo e stackoverflow.com/questions/417916/how-to-do-a-mass-rename .