Equivalente ao Windows do wildcarding do diretório ls * (asterisco)?

13

Outra pergunta de um usuário de longa data do Unix / Linux que se encontra em um mundo Windows. Primeiro, deixe-me explicar exatamente o que estou tentando fazer. Eu estou usando o shell do Windows cmd.exe, e eu quero listar todos os diretórios abaixo do diretório atual que contêm uma hierarquia bin \ Debug e determinar se eles contêm arquivos (por exemplo: tentando descobrir se meu alvo limpo NAnt é trabalhando corretamente). Minha hierarquia pode ser algo assim:

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

No Unix, ls */bin/Debug apenas me forneceria uma lista de todas as coisas em DirA/bin/Debug e mostraria o fato de que DirB/bin/Debug está vazio. Eu tentei contorções diferentes no shell cmd, mas continuo enrolando coisas como:

    > dir *\bin\Debug
    The filename, directory name, or volume label syntax is incorrect.

    > dir *\*\*
    The filename, directory name, or volume label syntax is incorrect.

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

Sim, percebo que posso simplesmente alternar para o explorador, navegar, clicar com o botão direito do mouse e provavelmente criar uma pesquisa que faça o que eu quero, mas estou mais interessado na solução de linha de comando rápida e simples.

    
por Ogre Psalm33 06.05.2009 / 23:00

6 respostas

12

Algo como isso deve fazer o que você quer. No diretório raiz do tipo de projeto:


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

Argumentos do diretório: / s - recursivo, / b - "nu", sem informações adicionais
Argumentos findstr: / i - ignorar maiúsculas e minúsculas

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

    
por 07.05.2009 / 00:28
7

O Windows não faz curingas como o Linux faz. Somente a parte do nome do arquivo pode conter curingas.

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

    
por 06.05.2009 / 23:04
2

unxutils possui um comando ls. O problema é realmente com o shell do Windows, no entanto. No unix, seu shell expandirá */bin/Debug para os nomes de caminho relevantes e os alimentará para 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ê quisesse seguir a rota dos scripts, poderia codificar algo em Python facilmente usando o módulo glob , e a maioria das outras linguagens de script tem um equivalente.

    
por 06.05.2009 / 23:14
2

Você pode fazer algo como "dir / s * .obj * lib". Isso dará um resumo no final de quantos arquivos foram correspondidos.

    
por 07.05.2009 / 00:05
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 (em seguida, substitua cada% em dobro %%). Ou defina uma macro usando doskey (sim, ela ainda existe).

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

EDITAR: Como funciona:

O primeiro loop for itera em todos os subdiretórios (alternância / D e / r) iterativamente. % ~ fP expande para o caminho completo desse diretório. Em seguida, ele 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 como uma saída dir. O caractere @ evita que os comandos sejam impressos na tela.

Para mais, veja

por 07.05.2009 / 00:36
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 array argv. Portanto, cada programa analisa e expande de forma diferente, e alguns dos usos mais avançados (como o que você está procurando) geralmente não são suportados.

a sugestão de timgilbert de usar o Cygwin é uma bom, também o pacote GNUWin32 pode ter algo que te ajudará.

    
por 07.05.2009 / 00:00