Esse script em lote fará isso.
@echo off
set target=%~1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!:" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
Salve-o como qualquer arquivo .bat e execute-o com o comando batchfile (substitua o que você nomeou) para listar o diretório atual ou especifique um caminho com batchfile "path" . Ele pesquisará todos os subdiretórios.
Se você deseja exportar para um arquivo, use batchfile >filename.txt (ou batchfile "path" >filename.txt ).
Explicação
Tudo antes da linha for /f... apenas define as configurações: ele faz o diretório de destino pesquisar, permite a expansão atrasada o que me permite atualizar variáveis no loop e define uma nova linha ( LF ) que eu posso usar para saída mais nativa. Ah, e o %~1 significa "pegue o primeiro argumento, removendo as aspas", o que evita aspas duplas - veja for /? .
O loop usa o comando dir /b /s /a:-d "%target%" , pegando uma lista de todos os arquivos em todos os subdiretórios abaixo do alvo.
%%~xi extrai a extensão dos caminhos completos que o comando dir retorna.
Uma extensão vazia é substituída por "FileWithNoExtension", então você sabe que existe tal arquivo - se eu adicionei uma linha vazia, não é tão óbvio.
Toda a lista atual, se enviada por meio de um comando find , para garantir a exclusividade. A saída de texto do comando find é enviada para nul , essencialmente um buraco negro - não o queremos. Como sempre adicionamos : no final da lista, também devemos garantir que a consulta de pesquisa termine com : , para que ela não corresponda aos resultados parciais, consulte os comentários.
% ERRORLEVEL% é definido pelo comando find , um valor de 0 indica que houve uma correspondência. Portanto, se não for 0, a extensão atual não está na lista até o momento e deve ser adicionada.
A linha de eco basicamente produz, e eu também substituo meus espaços reservados ( : ) por novas linhas para que pareça legal.