
Como alguém poderia percorrer uma pasta e suas subpastas (diretório e seus subdiretórios) e listar quantos arquivos de uma determinada extensão existem naqueles no total, para cada extensão que ocorre nessas pastas?
Algo semelhante a isto,
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
A soma acima deve ser igual ao total dir/s
que lista todos os arquivos e subpastas em alguma pasta.
Responder1
Se não precisar ser linha de comando, você pode usar o WinDirStat.http://windirstat.info/download.html
Responder2
O próximo trecho de código pode ajudar:
@ECHO OFF >NUL
SETLOCAL EnableExtensions
rem EnableDelayedExpansion
rem next line: clear/delete all `_filesTotal` environment variables
for /F "delims==" %%G in ('set _filesTotal 2^>NUL') do set "%%G="
rem next line: initialize `_foldersTotal` environment variable
set "_foldersTotal=0"
pushd "folder where count"
for /F "delims=" %%G in ('dir /B /S /A') do (
if exist "%%~G\" (
rem folder %%G
set /A "_foldersTotal+=1"
) else (
rem file %%G
if "%%~xG"=="" (set /A "_filesTotal.+=1") else (set /A "_filesTotal%%~xG+=1")
)
)
rem next two lines: display raw results
echo %CD%
set _foldersTotal
set _filesTotal
popd
Recursos(leitura obrigatória):
- (referência de comando)Um índice AZ da linha de comando do Windows CMD
- (particularidades adicionais)Sintaxe de linha de comando do shell CMD do Windows
- (
%~G
etc. página especial)Argumentos de linha de comando (parâmetros) - (
>>
,2>NUL
etc. página especial)Redirecionamento
Responder3
Recomendo que você considere uma abordagem Powershell para sua pergunta. São um pouco menos linhas de código com a capacidade de classificar a saída…
$foldercount = 0
$hash = @{}
Get-ChildItem -Path "C:\Code Samples" -Recurse | ForEach-Object {
if ($_.Attributes -eq 'Directory')
{
++$foldercount
}
else
{
if ($hash.ContainsKey($_.Extension))
{ $count = $hash.Get_Item($_.Extension); ++$count; $hash.Set_Item($_.Extension, $count) }
else
{ $hash.Add($_.Extension, 1) }
}
}
Write-Host $foldercount folders
$hash.GetEnumerator() | Sort-Object Value -descending
E produz esta saída para minha pasta de amostra ...
90 folders
Name Value
---- -----
.tlog 186
.h 72
.obj 56
.cpp 54
.pdb 26
.manifest 24
.res 23
.rc 22
.log 15
.lastbuildstate 12
.ipch 12
.ico 12
.exe 12
.idb 12
.vcxproj 11
.ilk 11
.user 11
.sdf 11
.zip 11
.filters 11
.sln 11
.pch 11
.txt 8
.gif 8
.rc2 8
.aps 8
.bmp 7
.dsw 6
.dsp 6
.png 5
.css 5
.html 4
.old 4
.XML 4
.vcproj 4
.xslt 4
.exp 3
.dll 3
.lib 3
.clw 2
.def 2
.opt 2
.ncb 2
.plg 2
.recipe 2
.rtf 1
.jpg 1
.h original 1
.bat 1
.js 1
.cpp original 1
.DPbcd 1
Responder4
Esta é uma abordagem muito simples e eficiente
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c