RS232 book cover

Centrum Outlook Express Centrum Outlook Express

OE PowerTool 4.5.5


Twój adres IP to: 18.97.9.168
Przeglądarka: CCBot/2.0 (https://commoncrawl.org/faq/)

Jak sprawdzić, w którym z katalogów jest najwięcej plików?

   Kiedyś na grupach dyskusyjnych pojawiło się pytanie o to, jak sprawdzić w którym z katalogów jest najwięcej plików. Pliki, które były w podkatalogach nie miały się liczyć, czyli przykładowo dla C:\ mogło być 10 plików a dla C:\Windows 200 plików. Jako rozwiązanie problemu wybrałem napisanie skryptu w PowerShellu, który zamieszczam poniżej:

ls . -force -recurse | Where-Object {
   $_.PSisContainer -eq $true
} | ForEach-Object {
   Write-Progress 'Examining Folder' ($_.FullName); $_
} | ForEach-Object {
   $result = '' | Select-Object Path, Count;
   $result.Path = $_.FullName;
   $result.Count = @($_ | ls -force -ea SilentlyContinue `
   | where {$_.PSisContainer -eq $false}).length; $result
} | sort Count -descending |foreach{$_.Path;$_.Count}

Co tu się dzieje? Najpierw za pomocą ls -r pobieramy strukturę plików i katalogów z której zostawiamy tylko katalogi. Dla każdego z nich rozpoczynamy od wyświetlenia jego nazwy za pomocą Write-Progress. Potem ze stringa $result tworzymy sobie strukturę o polach Path i Count. Do Path zapisujemy aktualny katalog. W Count chcemy mieć ilość plików. W tym celu znów odpalamy ls ale już nie rekurencyjnie. Dostajemy listę z której pobieramy jej długość i zapisujemy w Count. Następnie zostaje posortowanie wyników malejąco i wyświetlenie nazwy każdego katalogu i liczby jego plików. Znaczek @ jest konieczny ponieważ PowerShell automatycznie jednoelementowe tablice zmienia w pojedyncze obiekty a taki pojedynczy obiekt nie ma właściwości Length. Znaczek ten po prostu rzutuje obiekt na tablicę.