Se não precisar ser a linha de comando, você pode usar o WinDirStat. link
Como se pode atravessar uma pasta e suas subpastas (diretório e seus subdiretórios) e listar quantos arquivos de uma determinada extensão existem no total, para cada extensão que ocorre nessas pastas?
Algo parecido com isso,
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
A soma acima deve ser igual ao total em dir/s
, que lista todos os arquivos & subpastas em alguma pasta.
Se não precisar ser a linha de comando, você pode usar o WinDirStat. link
O próximo snippet 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):
%~G
etc. página especial) Argumentos da linha de comando (parâmetros)
>>
, 2>NUL
etc. página especial) Redirecionamento
Recomendo que você considere uma abordagem Powershell à sua pergunta. É 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 essa 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
How could one transverse through a folder and its subfolders (directory and its subdirectories) and list how many files of a certain extension there is in those in total, for every extension that occurs in those folders?
Use os três arquivos em lote a seguir.
Notas:
Total.cmd :
@echo off
setlocal enabledelayedexpansion
rem count directories
call CountDirs
rem get list of extensions
for /f "usebackq" %%i in ('dir /a:-d /b /s') do (
set _extension=%%~xi
if [!_extension!] neq [] echo !_extension:~1! >> %temp%\extensions
)
rem get list of unique extensions
set _last=
for /f "usebackq" %%j in ('sort %temp%\extensions') do (
set _this=%%j
if [!_last!] neq [!_this!] echo !_this! >> %temp%\unique
set _last=%%j
)
rem count the files
for /f %%k in (%temp%\unique) do (
call CountFiles %%k
)
rem cleanup
if exist %temp%\extensions del %temp%\extensions
if exist %temp%\unique del %temp%\unique
endlocal
CountDirs.cmd :
@echo off
rem count directories
dir /a:d /b /s | find "" /c /v > %temp%\count
set /p _count=<%temp%\count
rem cleanup
del %temp%\count
echo folders %_count% total
CountFiles.cmd :
@echo off
rem count files matching %1
dir /b *.%1 /s 2> nul | find "" /v /c > %temp%\count
set /p _count=<%temp%\count
rem cleanup
del %temp%\count
echo .%1 %_count% total
Exemplo de saída :
F:\test>Total.cmd
folders 15 total
.1 1 total
.bat 1 total
.cmd 10 total
.csv 6 total
.exe 4 total
.html 1 total
.java 1 total
.jpg 1 total
.js 1 total
.mak 1 total
.php 1 total
.ps1 1 total
.sh 1 total
.txt 19 total
.txt1 2 total
.zip 1 total
F:\test>