Как мне найти 10 самых больших файлов в структуре каталогов - PullRequest
27 голосов
/ 28 апреля 2009

Как мне найти 10 самых больших файлов в структуре каталогов?

Ответы [ 6 ]

39 голосов
/ 28 апреля 2009

Попробуйте этот скрипт

Get-ChildItem -re -in * |
  ?{ -not $_.PSIsContainer } |
  sort Length -descending |
  select -first 10

Разбивка:

Блок фильтра "?{ -not $_.PSIsContainer }" предназначен для фильтрации каталогов. Команда sort отсортирует все оставшиеся записи по размеру в порядке убывания. Предложение select будет разрешено только первые 10, поэтому оно будет самым большим 10.

34 голосов
/ 01 мая 2009

Это можно немного упростить, поскольку директории не имеют длины:

gci . -r | sort Length -desc | select fullname -f 10
3 голосов
/ 25 апреля 2015

Я написал о похожей проблеме , где я хочу найти самые большие файлы в каталоге и всех подкаталогах (например, весь диск C:), а также перечислить их размер в хорошем простой для понимания формат (ГБ, МБ и КБ). Вот функция PowerShell, которую я использую, которая перечисляет все файлы, отсортированные по размеру в хорошем Out-GridView:

Get-ChildItem -Path 'C:\SomeFolder' -Recurse -Force -File 
        | Select-Object -Property FullName
             ,@{Name='SizeGB';Expression={$_.Length / 1GB}}
             ,@{Name='SizeMB';Expression={$_.Length / 1MB}}
             ,@{Name='SizeKB';Expression={$_.Length / 1KB}} 
        | Sort-Object { $_.SizeKB } -Descending 
        | Out-GridView

Вывод в GridView удобен тем, что позволяет легко фильтровать результаты и прокручивать их. Это более быстрая версия PowerShell v3, но в блоге также показана более медленная версия, совместимая с PowerShell v2.

И, конечно, если вам нужны только 10 самых больших файлов, вы можете просто добавить параметр -First 10 к вызову Select-Object.

0 голосов
/ 17 октября 2018

Вот самый быстрый способ сделать это, я знаю:

$folder  = "$env:windir" # forder to be scanned
$minSize = 1MB

$stopwatch =  [diagnostics.stopwatch]::StartNew()

$ErrorActionPreference = "silentlyContinue"
$list = New-Object 'Collections.ArrayList'
$files = &robocopy /l "$folder" /s \\localhost\C$\nul /bytes /njh /njs /np /nc /fp /ndl /min:$minSize
foreach($file in $files) {
    $data = $file.split("`t")
    $null = $list.add([tuple]::create([uint64]$data[3], $data[4]))
}

$list.sort() # sort by size ascending
$result = $list.GetRange($list.count-10,10) 
$result | select item2, item1 | sort item1 -Descending

$stopwatch.Stop()
$t = $stopwatch.Elapsed.TotalSeconds
"done in $t sec."
0 голосов
/ 07 июня 2016

Основной для получения 10 самых больших файлов в локальном каталоге использует h для удобочитаемого, S сортирует файлы по размеру:

ls -Sh -l |head -n 10

или вы можете использовать

du -ha /home/directory |sort -n -r |head -n 10
0 голосов
/ 14 марта 2014

Если вам нужно немного отформатировать набор результатов, вот две функции с более приятными на вид выходными данными:

#Function to get the largest N files on a specific computer's drive
Function Get-LargestFilesOnDrive
{
Param([String]$ComputerName = $env:COMPUTERNAME,[Char]$Drive = 'C', [Int]$Top = 10)
Get-ChildItem -Path \\$ComputerName\$Drive$ -Recurse | Select-Object Name, @{Label='SizeMB'; Expression={"{0:N0}" -f ($_.Length/1MB)}} , DirectoryName,  Length | Sort-Object Length -Descending  | Select-Object Name, DirectoryName, SizeMB -First $Top | Format-Table -AutoSize -Wrap    
}

#Function to get the largest N files on a specific UNC path and its sub-paths
Function Get-LargestFilesOnPath
{
    Param([String]$Path = '.\', [Int]$Top = 10)
    Get-ChildItem -Path $Path -Recurse | Select-Object Name, @{Label='SizeMB'; Expression={"{0:N0}" -f ($_.Length/1MB)}} , DirectoryName,  Length | Sort-Object Length -Descending  | Select-Object Name, DirectoryName, SizeMB -First $Top | Format-Table -AutoSize -Wrap
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...