Eu encontrei uma solução sem usar o powershell:
λ dir /b "..\src\" | findstr /r /c:".*\.cpp$"
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 acontece:
λ dir /b "..\src\*.cpp"
main.cpp
main.cpp_
main.cpp2
Por que esse caractere curinga corresponde a main.cpp _ e main.cpp2 ?
O que é uma solução funcional para listar apenas arquivos * .cpp em um diretório?
EDIT: não é uma duplicata de cmd tem bug curinga?
Embora seja um pouco estranho, funciona conforme especificado (marcação em itálico por mim):
You can use wildcard characters (* or?), to represent one or more characters of a file name and to display a subset of files or subdirectories.
Asterisk (*): Use the asterisk as a substitute for any string of characters, for example:
dir *.txt lists all files in the current directory with extensions that begin with .txt, such as .txt, .txt1, .txt_old.
dir read*.txt lists all files in the current directory that begin with "read" and with extensions that begin with .txt, such as .txt, .txt1, or .txt_old.
dir read*.* lists all files in the current directory that begin with "read" with any extension.
The asterisk wildcard always uses short file name mapping, so you might get unexpected results.
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.
Edite porque não consigo 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 programa dir
. 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.