Questão Windows CMD: o curinga “dir * .cpp” corresponde a “main.cpp_” e “main.cpp2” [duplicado]


Esta questão já tem uma resposta aqui:

Aqui está o conteúdo do diretório:

λ dir /b "..\src\"
main.c
main.c_
main.c2
main.cpp
main.cpp_
main.cpp2

Isso funciona como esperado:

λ dir /b "..\src\*.c"
main.c

Isso não:

λ dir /b "..\src\*.cpp"
main.cpp
main.cpp_
main.cpp2

Por que essa correspondência de curinga main.cpp_ e main.cpp2?

O que é uma solução de trabalho para listar apenas arquivos * .cpp em um diretório?

EDIT: não é uma duplicata de cmd tem bug curinga?


1


origem


Existem provavelmente outros possíveis alvos duplicados também; Eu recomendo olhar através de perguntas marcou "wildcards". - Michael Kjörling
Nomes de arquivos longos, NTFS e caracteres de nome de arquivo válido - "Habilitar ou desabilitar nomes de arquivo 8.3 no NTFS ...[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] NtfsDisable8dot3NameCreation=1 para desativar - o padrão está ativado. - DavidPostill♦
Não há um bug. Como foi explicado. A sintaxe que você está usando está se comportando da forma como foi projetada. O título da duplicata é ruim, já que não há um bug, mas é uma duplicata. - Ramhound


Respostas:


Embora de fato um pouco estranho, funciona como especificado (itálico marcado por mim):

Você pode usar caracteres curinga (* ou?) Para representar um ou mais   caracteres de um nome de arquivo e exibir um subconjunto de arquivos ou   subdiretórios.

Asterisco (*): Use o asterisco como um substituto para qualquer string de   caracteres, por exemplo:

dir * .txt lista todos os arquivos no diretório atual com extensões   aquele começar com .txt, como .txt, .txt1, .txt_old.

dir read * .txt lista todos os arquivos no diretório atual que começam com   "ler" e com extensões que começam com .txt, como .txt, .txt1,   ou .txt_old.

dir read *. * lista todos os arquivos no diretório atual que começam com   "ler" com qualquer extensão.

O curinga asterisco sempre usa mapeamento de nome de arquivo curto, então você   pode obter resultados inesperados.


1



Pode valer a pena adicionar à sua resposta que dir /x ... mostrará os nomes dos arquivos curtos e longos. - DavidPostill♦
Em relação à última frase, eu me pergunto o que acontece quando se desativa 8.3 nomes de arquivos curtos no sistema de arquivos? (fsutil behavior set disable8dot3 1) - paradroid
Então você pode me dizer onde cmd tem bug curinga? existe uma solução para o problema descrito aqui? Como você pode listar arquivos * .cpp em um diretório? - raphaelh
A primeira resposta diz: "Use dir / x para mostrar (e trabalhar com) versões curtas de nomes de arquivos". assim dir /x *.cpp deve funcionar (não testado). - agtoever
Exceto eu não quero mostrar ou trabalhar com versões curtas de nomes de arquivos, eu só quero listar arquivos * .cpp em um diretório ... λ dir /x "..\src\*.cpp" | find "/"  09/09/2015 17:52 51 605 main.cpp  09/09/2015 17:52 51 605 MAIN~1.CPP main.cpp_  09/09/2015 17:52 51 605 MAIN~2.CPP main.cpp2 - raphaelh


Porque a extensão tem mais de 3 caracteres e você está usando um interpeter de comando que tem muito código de compatibilidade com versões anteriores para aplicativos de 16 bits. Se você executasse o mesmo comando no PowerShell, ele se comportaria como esperado.

Editar porque não posso responder aos comentários

Sim, basta executar o powershell.exe e, em seguida, emitir o mesmo comando, menos o sinalizador / b.

Editar 2

Tanto quanto eu sei, não, não haveria uma solução a menos que você quisesse escrever seu próprio dir programa. E em relação ao PowerShell, seria uma boa idéia começar a se familiarizar com ele, pois tenho certeza de que a Microsoft está tentando eliminar o interpretador herdado do DOS.


1



Obrigado! Então, existe uma solução? - raphaelh
Há uma solução sem usando o powershell? - raphaelh
Nomes de arquivos longos, NTFS e caracteres de nome de arquivo válido - "Habilitar ou desabilitar nomes de arquivo 8.3 no NTFS ...[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] NtfsDisable8dot3NameCreation=1" - DavidPostill♦


Eu encontrei uma solução sem usar o powershell:

λ dir /b "..\src\" | findstr /r /c:".*\.cpp$"

-2



Estranho. Eu li sua postagem original como uma pergunta, não como um problema. É por isso que eu dei uma resposta ao invés de uma solução para um problema ... Se isto funciona para você, por favor aceite sua própria resposta, então esta questão será encerrada. - agtoever
Desculpe se eu não fui claro o suficiente! Descobri que não posso aceitar minha própria resposta até dois dias. - raphaelh