Como extrair uma lista completa de tipos de extensão dentro de um diretório?

25

Dentro de um diretório, e recursivamente dentro de seus subdiretórios, o que significa que todo diretório dentro de um diretório é processado, como eu compilo uma lista completa de extensões exclusivas dentro do diretório?

O SO é o Windows XP com todas as atualizações atuais, mas eu estou bem executando o script se sou capaz de dizer o que está fazendo, embora eu prefira não ter que instalar o dot-net, já que eu realmente não gosto dele.

    
por blunders 07.03.2012 / 15:44

5 respostas

27

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.

    
por 07.03.2012 / 16:24
14

Embora não cumpra rigorosamente o requisito de um script em lote, usei um script powershell de linha única:

Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt

Você poderia potencialmente executá-lo a partir da linha de comando / arquivo em lotes:

Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"

Eu não reivindico nenhum crédito por isso e, claro, você precisará da instalação do Powershell. Para versões mais recentes do Windows, não há como evitar isso.

Se você remover C:\MyDirectory , ele será executado no diretório atual.

No final, ele produzirá um FileExtensions.txt contendo algo como o seguinte:

+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216  | .xml |
| 4854  | .png |
| 4378  | .dll |
| 3565  | .htm |
| ...   | ...  |
+-------+------+

Dependendo da sua estrutura de pastas, você pode ocasionalmente receber erros que notificam que você tem um longo caminho.

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

Todos os subdiretórios também não serão analisados, mas os resultados de todo o restante ainda serão exibidos.

    
por 18.09.2014 / 02:56
4

Aqui está uma resposta detalhada usando o PowerShell (com o Windows XP você terá que instalar o PowerShell):

Ei, Equipe de Scripts! Como posso usar o Windows PowerShell para escolher as extensões de arquivo exclusivas usadas em uma coleção de arquivos?

    
por 07.03.2012 / 16:32
0

Para listar todas as extensões exclusivas do cmd sob o caminho que você está usando:

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"
    
por 14.06.2017 / 01:34
0

achei útil mudar

if "!ext!"=="" set ext=FileWithNoExtension

para

if "!ext!"=="" set ext=.FileWithNoExtension

e para alterar

echo %extlist::=!LF!%

para

echo %extlist::=!LF!% > ext-list.txt

O arquivo gerado continha (sem linefeeds, mas não importa) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg.dwg.exr.FileWithNoExtension.vrlmap.sat.bak .ctb

que eu pude usar no meu projeto.

    
por 28.11.2017 / 13:40