O Windows 7 e versões posteriores têm um shell de energia:
Você pode tentar:
Get-ChildItem \*\*\*
Isso retorna todos os itens com uma profundidade de duas subpastas. Adicionar * adiciona uma subpasta adicional para pesquisar.
Fonte: link
Eu quero, com um arquivo de lote, poder pesquisar e exibir os arquivos em um monte de pastas chamadas "error" localizadas em vários lugares diferentes.
A pasta de erros está sempre na mesma profundidade de pasta, mas os nomes das pastas antes deles são diferentes.
dir /A-d /b C:\Temp\*random_folder_name*\*random_folder_name*\error
Então, posso criar uma linha que exiba todos os arquivos em todas as pastas de erro, duas pastas "abaixo", neste exemplo "C: \ Temp"? ou eu tenho que adicionar uma linha dir para cada pasta de erro?
O Windows 7 e versões posteriores têm um shell de energia:
Você pode tentar:
Get-ChildItem \*\*\*
Isso retorna todos os itens com uma profundidade de duas subpastas. Adicionar * adiciona uma subpasta adicional para pesquisar.
Fonte: link
Você poderia instalar as bibliotecas GNU Win32 e usar grep para isto:
dir /b /s *.*|grep "error\[^\]*$"
A maneira sugerida para instalá-los é com o getgnuwin32 .
BTW, se você quiser ver os arquivos de texto, será assim:
dir /b /s *.txt|grep "error\[^\]*$"
Se você quiser garantir que apenas pastas de certa profundidade sejam usadas, é um pouco mais complicado:
dir /b /s *.*|grep "^\([^\]*\\)\{7\}error\[^\]*$"
Isso só mostrará resultados onde o diretório de erro tem sete diretórios (do diretório raiz).
Aqui está uma solução relativamente simples, mas ineficiente, usando FINDSTR com uma expressão regular. Eu uso [\]
para corresponder a \
devido a uma inconsistência no Vista.
@echo off
dir /b /s c:\temp\*|findstr /rix "c:[\]temp[\][^\]*[\][^\]*[\]error[\][^\]*"
Aqui está uma solução mais complicada, mas muito eficiente, usando várias declarações FOR.
@echo off
for /d %%A in (c:\temp\*) do for /d %%B in ("%%A\*") do for %%C in ("%%B\error\*") do echo %%C
O Windows tem alternativas integradas ao grep: find
e findstr
.
findstr
suportará uma expressão regular (você pode obter mais informações digitando help findstr
), mas você será um pouco limitado pela saída de dir
, o que não parece oferecer suporte a listagens relativas ...
dir /A-d /S /B | findstr /B /R /I /X "C:\Temp\[^\]*\[^\]*\error\.*"