Verzeichnisgröße

Im Windows-Explorer bestimmt man die Größe eines Verzeichnisses (und aller Unterordner) über die Eigenschaften. Wenn man allerdings einen raschen Gesamtüberblick braucht, ist es besser eine geeignete App oder ein Skript zu verwenden.

Eine Hörbibliothek wird geordnet. Das Ziel ist es, in einer großen Zahl von Büchern auch systematisch ein Buch zu finden. Dazu werden die Bücher in Sachgebiete eingeordnet, mit dem Ziel, die einzelnen Sachgebiete auf SD-Karten zu speichern, um sie mit einem geeigneten Player abspielen zu können.

Die Kapitel sind derzeit Alltag · AlterUndTod · Anthropologie · Architektur · Astronomie · Beschreibungen · Biografien · Blind · Computer · Das_Beste · Digital · Ernährung · Erotik · Feature · Film · Fußball · Geografie · Geschichte · Gesellschaft · Gesundheit · Globalisierung · Hörfilm · Hörspiel · Kinder · Krimi · Kunst · Literatur · Mathematik · Medizin · Musik · Nationalsozialismus · Natur · Philosophie · Physik · Psychologie · Reisen · Reisen-Berge · Reisen-Gegenden · Reisen-Städte · Religion · Roman · Science Fiction · Soziales · Soziologie · Sprachen · Tiere · Unterhaltung · Unterhaltung-Deutschland · Verhaltensforschung · Weltliteratur · Wirtschaft · Wissenschaft · _OE1 · _unsortiert · Österreich

Dies Ordnung ist keineswegs endgültig. Das Ziel sind etwa gleich große Verzeichnisse mit einer Obergrenze von 30 GB, weil das die größtmögliche Größe für die SD-Karten ist.

App WinDirStat

Mit der App WinDirStat gewinnt man einen raschen Überblick über die Größe der einzelnen Verzeichnisse und auch über die Dateitypen.

Hörbuchverzeichnis nach Größen geordnet. [blau: .mp3, rot: .wav, grün: .odg]

Script Tree-Size

Um große Datenmengen ui organisieren, sind Bearbeitungs-Programme praktisch. Hier wird ein Skript vorgestellt, das die Größe der Verzeichnisse berechnet und auch gleichzeitig die gewählte Bezeichnungssystematik berücksichtigt.

Tree-Size-1.ps1

Das folgende Skript bestimmt die Größe des gesamten Hörbuch-Ordners: (siehe How to recursively get the size of all files and folders in Powershell (stackoverflow.com)

    $Path = "S:\OneDrive\OneDrive-Silvia\Hörbücher\"
    $TotalSize = 0
    $Objects = Get-ChildItem $Path
    foreach ($Object in $Objects)
    {
        $SubFolderItems = Get-ChildItem $Object.FullName -Recurse -Force `
            | Where-Object {$_.PSIsContainer -eq $false} `
            | Measure-Object -Property Length -Sum `
            | Select-Object Sum
        $TotalSize += $SubFolderItems.Sum / 1MB
    }
    ([string][Math]::Round($totalSize,0)).Padleft(8,' ') + " MB " + "Hörbücherei"

Ausgabe

PS C:\Users\EIZO> S:\OneDrive\Dokumente\PowerShell\aktuell\Tree-Size-0.ps1
532989 MB Hörbücherei

Gewünscht ist aber die Bestimmung aller Ordnergrößen im Hörbuchverzeichnis.

Tree-Size-2.ps1

In einer zweiten Version wird die Größe aller Unterordner bestimmt. Dazu wird das Skript in der Version 1 in eine Funktion verpackt und diese Funktion für jedes Unterverzeichnis aufgerufen.

$Hoerbucherei = "S:\OneDrive\OneDrive-Silvia\Hörbücher\"

function GetSize {

    Param ([string] $Path)

    $totalSize = 0
    $Objects = Get-ChildItem $Path
    foreach ($Object in $Objects)
    {
        $SubFolderItems = Get-ChildItem $Object.FullName -Recurse -Force `

            | Where-Object {$_.PSIsContainer -eq $False} `
            | Measure-Object -Property Length -Sum `
            | Select-Object Sum
        $TotalSize += $SubFolderItems.Sum / 1MB
    }
    ([string][Math]::Round($totalSize,0)).Padleft(8,' ') + " MB " + $Path.Replace($Hoerbucherei,"")
}

$Directories = Get-ChildItem -Path $Hoerbucherei -Directory
foreach ($Directory in $Directories) {
    GetSize $Directory.FullName
}

Ausgabe (gekürzt)

    2149 MB Alltag
    1241 MB AlterUndTod
    2223 MB Anthropologie
     105 MB Architektur
     142 MB Astronomie
     244 MB Beschreibungen
   40479 MB Biografien
    1522 MB Blind
    1329 MB Computer
    1822 MB Das_Beste
     560 MB Digital
    1032 MB Ernährung
    7943 MB Erotik
     553 MB Feature
     582 MB Film
    3524 MB Fußball
       4 MB Geografie
    7316 MB Geschichte
     982 MB Gesellschaft
    1729 MB Gesundheit
      32 MB Globalisierung
    1541 MB Hörfilm
     657 MB Hörspiel
    8272 MB Kinder
   24722 MB Krimi
     105 MB Kunst
     610 MB Literatur
      90 MB Mathematik
    1068 MB Medizin
     185 MB Musik
     795 MB Nationalsozialismus
     396 MB Natur
    6451 MB Philosophie
     538 MB Physik
   25808 MB Psychologie
   16044 MB Reisen
    4672 MB Reisen-Berge
    5759 MB Reisen-Gegenden
...

Das ist besser, bietet aber keinen Einblick in jene Ordner, die noch weitere strukturelle Unterordnung haben, zum Beispiel bei den Kapiteln Biografie, Unterhaltung und Weltliteratur.

Tree-Size-3.ps1

Daher wird dasselbe Skript rekursiv ausgeführt, es wird also bei jedem Ordner untersucht, ob es weitere Unterordner gibt. Dazu benötigt man Kenntnis über die Bezeichnung der eigentlichen Hörbuchordner.

Jedes Hörbuch ist in einem Ordner mit einer Erweiterung. Erlaubte Erweiterungen sind .cd (Sammlung von Audio-Dateien) und .daisy (Navigierbares Hörbuchformat). Alle Ordner ohne eine solche Erweiterung dienen zur Strukturierung des Hörbuchverzeichnisses. Das Skript bestimmt die Ordnergröße aller Strukturverzeichnisse rekursiv.

$Hoerbucherei = "S:\OneDrive\OneDrive-Silvia\Hörbücher\"

function GetSize {

    Param ([string] $Path, [int] $Level)

    $totalSize = 0
    $Objects = Get-ChildItem $Path
    foreach ($Object in $Objects)
    {
        $SubFolderItems = Get-ChildItem $Object.FullName -Recurse -Force `
            | Where-Object {$_.PSIsContainer -eq $False} `

            | Measure-Object -Property Length -Sum `

            | Select-Object Sum
        $TotalSize += $SubFolderItems.Sum / 1MB
        if ($Object.Extension -eq "") { 
            GetSize $Object.FullName ($Level+1) 
        }
    }
    $Indent = "  "
    $i=0
    for ($i -eq 0; $i -lt $Level; $i++) {
        $Indent += "  "
    }
    $Kapitel = $Path.Replace($Hoerbucherei,"")
    if ($Kapitel.Contains("\")) { $Kapitel = $Kapitel.Substring($Kapitel.LastIndexOf("\")+1) }
    ([string][Math]::Round($totalSize,0)).Padleft(8,' ') + " MB " + $Indent + $Kapitel
}

$Directories = Get-ChildItem -Path $Hoerbucherei -Directory
foreach ($Directory in $Directories) {
    GetSize $Directory.FullName 0
}

Diese Version ist nur geringfügig gegenüber Version2 erweitert. Auch die Größe von Unterordnern ohne Erweiterung wird durch rekursiven Aufruf von GetSize bestimmt. Um die Verschachtelung auf bei der Ausgabe anzuzeigen, wurde eine Variable $Level eingefügt, die bei jedem rekursiven Aufruf um 1 erhöht wird.

Ausgabe (gekürzt)

PS C:\Users\EIZO> S:\OneDrive\Dokumente\PowerShell\aktuell\Tree-Size-3.ps1
    2149 MB   Alltag
    1241 MB   Alter und Tod
    2223 MB   Anthropologie
     105 MB   Architektur
     142 MB   Astronomie
     244 MB   Beschreibungen
     101 MB     Anouilh_Jean
     591 MB     Beckett_Samuel
     491 MB     Beethoven_Ludwig
     261 MB     Bernhard_Thomas
     496 MB     Biden_Joe
     248 MB     Bohlen_Dieter
      60 MB     Braille_Louis
     153 MB     Böhm_Maxi
     582 MB     Chaplin_Charlie
...
   38791 MB   Biografien
    1522 MB   Blind
    1329 MB   Computer
    1822 MB   Das_Beste
     560 MB   Digital
    1032 MB   Ernährung
    7943 MB   Erotik
     553 MB   Feature
     582 MB   Film
    3524 MB   Fußball

Diese Ausgabe hat zwei Probleme: Wenn es Unterordner gibt, wird deren Größe mehrfach ermittelt. Ein übergeordnetes Verzeichnis wird erst nach den dazugehörigen Unterordnern angezeigt. Im Bild sieht man die Unterordner der Biografien und erst danach das Verzeichnis Biografie.

Tree-Size-4.ps1

Daher wird dasselbe Skript rekursiv ausgeführt, es wird also bei jedem Ordner untersucht, ob es weitere Unterordner gibt. Dazu benötigt man Kenntnis über die Bezeichnung der eigentlichen Hörbuchordner.

Jedes Hörbuch ist in einem Ordner mit einer Erweiterung. Ordner ohne Erweiterung dienen zur Strukturierung des Hörbuchverzeichnisses. Erlaubte Erweiterungen sind .cd (Sammlung von Audio-Dateien) und .daisy (Navigierbares Hörbuchformat). Alle Ordner ohne eine solche Erweiterung dienen zur Strukturierung des Hörbuchverzeichnisses. Das Skript bestimmt die Ordnergröße aller Strukturverzeichnisse rekursiv und sammelt die errechneten Verzeichnisgrößen (in MB) in einer SortedList aus dem C#-Framework. Nach der Speicherung aller Verzeichnisse wird das Verzeichnis ausgegeben. Um die Größe der Verzeichnisse besser lesen zu können, wird nach jeweils drei Stellen ein Punkt eingefügt.

$Hoerbucherei = "S:\OneDrive\OneDrive-Silvia\Hörbücher"

Clear-Host

$SortedList_Tree = New-Object Collections.SortedList
$Global:Id = 0
$Global:ShowSize = $False

function GetSize {

    Param ([string] $Path)

    $TotalSize = 0
    $Objects = Get-ChildItem $Path
    foreach ($Object in $Objects)
    {
        $SubFolderItems = Get-ChildItem $Object.FullName -Recurse -Force `

            | Where-Object {$_.PSIsContainer -eq $False} `
            | Measure-Object -Property Length -Sum `

            | Select-Object Sum
        $TotalSize += $SubFolderItems.Sum / 1MB

    }
    return $TotalSize
}

function CalculateTree {

    Param ([string] $Path, [int] $Level)

    $LocalId = $Id
    $FolderSize = 0
    $Files = Get-ChildItem $Path -File
    foreach ($File in $Files)
    {
        Write-Host "Error FileExists: $Path"
        $FolderSize += (Get-Item $File.FullName).Length
    }
    $SubFolders = Get-ChildItem $Path -Directory
    foreach ($SubFolder in $SubFolders)
    {
        $Global:Id++
        if ($SubFolder.Extension -eq "") { 
            $FolderSize += CalculateTree $SubFolder.FullName ($Level+1) 
        } else {
            if ($Global:ShowSize) {
                $SubFolderSize = GetSize $SubFolder.FullName 
                $FolderSize += $SubFolderSize
            }
            $SortedList_Tree.Add($Id,@($SubFolderSize,($Level+1),$SubFolder.Name))
        }
    }
    $SortedList_Tree.Add($LocalId,@($FolderSize,$Level,$Path.Substring($Path.LastIndexOf("\")+1)))
    return $FolderSize
}

function DrawTree {
    for($d=0; $d -lt $SortedList_Tree.Count; $d++) {
        $Indent = "  "
        for ($i = 0; $i -lt $SortedList_Tree[$d][1]; $i++) { $Indent += "  " }
        $DirName = $SortedList_Tree[$d][2]
        $Size = [string][Math]::Round($SortedList_Tree[$d][0],0)
        if ($Size.Length -gt 6) { 
            $Size = $Size.Substring(0,$Size.Length-6) `
            + "." + $Size.Substring($Size.Length-6,3) `
            + "." + $Size.Substring($Size.Length-3) 
        } elseif ($Size.Length -gt 3) { 
            $Size = $Size.Substring(0,$Size.Length-3) `
            + "." + $Size.Substring($Size.Length-3) 
        }
        $Size = $Size.Padleft(11,' ') + " MB "
        if ($Global:ShowSize) {
            Write-Host ( $Size + $Indent + $DirName)
        } else {
            Write-Host ( $Indent + $DirName)
        }
    }
}
CalculateTree $Hoerbucherei 0 0 > $Null
DrawTree

Dieses Programm ist schon recht brauchbar.

  • $Hoerbucherei ist der PFad zu den Hörbüchern
  • $Global:ShowSize zeigt die Ordnergröße an (langsam) oder unterdrückt die Anzeige der Ordnergröße (schnell)

Ausgabe (gekürzt – ohne Größenangabe $Global:ShowSize = $False)

...
    Verhaltensforschung
      Lorenz_Conrad Er_redete_mit_dem_Vieh.daisy
      Lorenz_Conrd Das_sogenannte_Böse.daisy
    Weltliteratur
      Alighieri_Dante
        Alighieri_Dante die_goettliche_komoedie.cd
      Andersen_Hans_Christian
        andersen daeumelinchen.cd
        maerchen.cd
      Austen_Jane
        Drei Schwestern.cd
      Balzac_Honore_de
        Die Frau_von_dreißig_Jahren.cd
        muench.cd
...

Ausgabe (gekürzt – ohne Größenangabe $Global:ShowSize = $True)

...
        469 MB     Verhaltensforschung
        149 MB       Lorenz_Conrad Er_redete_mit_dem_Vieh.daisy
        319 MB       Lorenz_Conrd Das_sogenannte_Böse.daisy
     76.844 MB     Weltliteratur
        253 MB       Alighieri_Dante
        253 MB         Alighieri_Dante die_goettliche_komoedie.cd
         88 MB       Andersen_Hans_Christian
         22 MB         andersen daeumelinchen.cd
         66 MB         maerchen.cd
         29 MB       Austen_Jane
         29 MB         Drei Schwestern.cd
        510 MB       Balzac_Honore_de
        457 MB         Die Frau_von_dreißig_Jahren.cd
         53 MB         muench.cd
...

Wegen der Größe dieses über Jahre gewachsenen Hörbuchverzeichnisses diente dieses Programm auch zum Aufspüren von Bezeichnungsfehlern.

Franz Fiala

Ehemaliger Präsident Clubcomputer / Herausgeber PCNEWS bei ClubComputer.at
Franz war pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreute unser Clubtelefon und Internet Support. Er war leidenschaftlicher Rapid Wien Fan. Er ist leider Anfang Jänner 2024 nach langer schwerer Krankheit verstorben.

Letzte Artikel von Franz Fiala (Alle anzeigen)

Zur Werkzeugleiste springen