
¿Cómo se podría recorrer una carpeta y sus subcarpetas (directorio y sus subdirectorios) y enumerar cuántos archivos de una determinada extensión hay en total, para cada extensión que ocurre en esas carpetas?
Algo parecido a esto,
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
La suma de lo anterior debe ser la misma que el total en dir/s
el que se enumeran todos los archivos y subcarpetas de alguna carpeta.
Respuesta1
Si no es necesario que sea una línea de comandos, puede usar WinDirStat.http://windirstat.info/download.html
Respuesta2
El siguiente fragmento de código podría ayudar:
@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(lectura obligatoria):
- (referencia de comando)Un índice AZ de la línea de comando CMD de Windows
- (particularidades adicionales)Sintaxis de la línea de comandos de Windows CMD Shell
- (
%~G
etc. página especial)Argumentos de la línea de comando (parámetros) - (
>>
,2>NUL
etc. página especial)Redirección
Respuesta3
Le insto a que considere un enfoque Powershell para su pregunta. Son un poco menos de líneas de código con la capacidad de ordenar la salida...
$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
Y produce este resultado para mi carpeta de muestra...
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
Respuesta4
Este es un enfoque muy simple y eficiente.
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c