
Wie könnte man einen Ordner und seine Unterordner (Verzeichnis und seine Unterverzeichnisse) durchsuchen und auflisten, wie viele Dateien einer bestimmten Erweiterung sich insgesamt darin befinden, für jede Erweiterung, die in diesen Ordnern vorkommt?
Etwas Ähnliches wie dies,
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
Die Summe der obigen Angaben sollte mit der Gesamtsumme übereinstimmen, in dir/s
der alle Dateien und Unterordner in einem Ordner aufgelistet sind.
Antwort1
Wenn es nicht die Befehlszeile sein muss, können Sie WinDirStat verwenden.http://windirstat.info/download.html
Antwort2
Der folgende Codeausschnitt könnte helfen:
@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
Ressourcen(Pflichtlektüre):
- (Befehlsreferenz)Ein AZ-Index der Windows CMD-Befehlszeile
- (weitere Besonderheiten)Befehlszeilensyntax der Windows CMD-Shell
- (
%~G
usw. Sonderseite)Befehlszeilenargumente (Parameter) - (
>>
,2>NUL
usw. Spezialseite)Umleitung
Antwort3
Ich rate Ihnen dringend, Ihre Frage mit Powershell zu beantworten. Das sind etwas weniger Codezeilen und die Möglichkeit, die Ausgabe zu sortieren …
$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
Und erzeugt diese Ausgabe für meinen Beispielordner …
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
Antwort4
Dies ist ein sehr einfacher und effizienter Ansatz
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c