Equivalente do Windows aos caracteres curinga do diretório ls * (asterisco)?

14

Outra pergunta de um usuário antigo de Unix / Linux que se encontra no mundo do Windows. Primeiro, deixe-me explicar exatamente o que estou tentando fazer. Estou usando o shell cmd.exe do Windows e quero listar todos os diretórios abaixo do diretório atual que contêm uma hierarquia bin \ Debug e determinar se eles contêm algum arquivo (por exemplo: tentando descobrir se meu destino limpo do NAnt é trabalhando corretamente). Minha hierarquia pode se parecer com isso:

\Current
    \DirA
         \bin
             \Debug
                  (some files under debug)
             \Release
    \DirB
         \bin
             \Debug
    \DirC
         \bin
             \Release

No Unix, ls */bin/Debugapenas me dava uma lista de todas as coisas DirA/bin/Debuge me mostrava o fato de que DirB/bin/Debugestá vazio. Eu tentei contorções diferentes no shell do cmd, mas continue com coisas como:

    > dir * \ bin \ Debug
    O nome do arquivo, nome do diretório ou sintaxe do rótulo do volume está incorreto.

    > dir * \ * \ *
    O nome do arquivo, nome do diretório ou sintaxe do rótulo do volume está incorreto.

Existe algo sutil que eu não entendo sobre o comando dir, ou é apenas limitado dessa maneira?

Sim, eu sei que posso mudar para o explorer, navegar, clicar com o botão direito e provavelmente criar uma pesquisa que faça o que eu quero, mas estou mais interessado na solução de linha de comando quick-n-dirty.

Salmo Ogro33
fonte
Embora seja bom saber sobre todas as ferramentas do tipo unix que posso adicionar ao Windows (e acredite, eu uso o Cygwin em casa!), Nem sempre as disponibilizarei onde quer que eu vá (e, de fato, pode não ter o direito do administrador de instale-os em todos os PCs que uso).
Ogre Psalm33

Respostas:

13

Algo assim deve fazer o que você deseja. No diretório raiz do projeto, digite:


c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

Argumentos de diretório: / s - recursivo, / b - "vazio", sem informações adicionais
argumentos findstr: / i - ignorar caso

Em geral, ' comando de ajuda ' mostrará ajuda para os comandos do shell. Se isso não funcionar, então
' command /?' geralmente mostrará ajuda.

James
fonte
Excelente! Sei que existem muitas ferramentas / kits de ferramentas por aí para me ajudar a "linuxizar" meu Windows, mas eu estava procurando a maneira do Windows fazer o que estou tentando fazer, e é exatamente isso!
Ogre Psalm33
7

O Windows não faz curingas da mesma maneira que o Linux. Somente a parte do nome do arquivo pode conter caracteres curinga.

Você pode baixar uma versão do ls que roda no Windows e usá-la. Eu usei Cygwin , mas tenho certeza que existem outros.

Mark Ransom
fonte
Também PowerShell
Joel Coehoorn
3
Outra coisa a ter em mente: os curingas do Windows são expandidos pelo comando, não pelo shell.
Laurence Gonsalves
2

unxutils tem um comando ls. O problema é realmente com o shell do Windows, no entanto. No unix, seu shell se expandirá */bin/Debugpara os nomes de caminho relevantes e os alimentará com o comando ls como argumentos separados da linha de comando.

O Cygwin certamente faria o truque para você, ou você poderia tentar uma porta do Windows de um shell unix como o bash . Se você quiser seguir a rota de script, poderá codificar algo em python com bastante facilidade usando o módulo glob , e a maioria das outras linguagens de script tem um equivalente.

Tim Gilbert
fonte
2

Você pode fazer algo como "dir / s * .obj * lib". Ele fornecerá um resumo no final de quantos arquivos corresponderam.

Joel Lucsy
fonte
Fechar. Eu dei a você adereços, mas a resposta de James é mais próxima, pois filtra os arquivos que não estão em \ debug para mim.
Ogre Psalm33
2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Não é legal, mas deve funcionar. Você também pode colocar em um arquivo .cmd (substitua cada% por duplo %%). Ou defina uma macro usando doskey (sim, ela ainda existe).

Verifique se as extensões do cmd estão ativadas.

EDIT: Como funciona:

O primeiro loop for itera através de todos os subdiretórios (opção / D e / r) iterativamente. % ~ fP se expande para o caminho completo desse diretório. Em seguida, anexa \ bin \ Debug * a esse caminho. O segundo loop for enumera todos os arquivos correspondentes. % ~ ftzaQ é expandido para cada correspondência de arquivo e impresso na tela por eco. O estranho% ~ ftzaQ formata-o como uma saída dir. O caractere @ evita que os próprios comandos sejam impressos na tela.

Para mais, consulte

Meinersbur
fonte
Eu tentei isso e realmente funciona. Mas sendo um pouco inexperiente no cmd shell, ainda não entendi tudo :-).
Ogre Psalm33
0

No mundo do Windows, o cmd.exe não expande curingas - eles são passados ​​como estão para o programa em sua linha de comando ou matriz argv. Portanto, cada programa analisa e expande de maneira diferente, e alguns dos usos mais avançados (como você está procurando) geralmente não são suportados.

A sugestão de timgilbert de usar o Cygwin é boa, também o pacote GNUWin32 pode ter algo que o ajudará.

Michael Burr
fonte