
Как можно просмотреть папку и ее подпапки (каталог и его подкаталоги) и составить список того, сколько всего файлов определенного расширения в них находится, для каждого расширения, которое встречается в этих папках?
Что-то похожее на это,
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
Сумма вышеперечисленных значений должна быть такой же, как и итоговая сумма, в dir/s
которой перечислены все файлы и подпапки в некоторой папке.
решение1
Если командная строка не нужна, можно использовать WinDirStat.http://windirstat.info/download.html
решение2
Следующий фрагмент кода может помочь:
@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
Ресурсы(обязательно к прочтению):
- (справочник команд)Индекс AZ командной строки Windows CMD
- (дополнительные особенности)Синтаксис командной строки оболочки Windows CMD
- (
%~G
и т.д. специальная страница)Аргументы командной строки (параметры) - (
>>
и2>NUL
т.д. специальная страница)Перенаправление
решение3
Я настоятельно рекомендую вам рассмотреть подход Powershell к вашему вопросу. Это немного меньше строк кода с возможностью сортировки вывода…
$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
И создает этот вывод для моей папки с образцами...
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
решение4
Это очень простой и эффективный подход.
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c