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.


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.


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.


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.


2

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


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


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á.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.