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/Debug
apenas me dava uma lista de todas as coisas DirA/bin/Debug
e me mostrava o fato de que DirB/bin/Debug
está 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.
fonte
Respostas:
Algo assim deve fazer o que você deseja. No diretório raiz do projeto, digite:
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.
fonte
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.
fonte
unxutils tem um comando ls. O problema é realmente com o shell do Windows, no entanto. No unix, seu shell se expandirá
*/bin/Debug
para 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.
fonte
Você pode fazer algo como "dir / s * .obj * lib". Ele fornecerá um resumo no final de quantos arquivos corresponderam.
fonte
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
fonte
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á.
fonte