如何在目录结构中找到10个最大的文件?
答案 0 :(得分:39)
试试这个脚本
Get-ChildItem -re -in * |
?{ -not $_.PSIsContainer } |
sort Length -descending |
select -first 10
故障:
过滤器块“?{ -not $_.PSIsContainer }
”用于过滤掉目录。 sort命令将按大小按降序对所有剩余条目进行排序。 select子句只允许前10个通过,因此它将是最大的10.
答案 1 :(得分:34)
这可以简化一点,因为目录没有长度:
gci . -r | sort Length -desc | select fullname -f 10
答案 2 :(得分:3)
我想blogged about a similar problem我想找到目录中最大的文件和所有子目录(例如整个C:驱动器),以及以简单易懂的格式列出它们的大小(GB,MB和KB)。这是我使用的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个最大的文件,你可以在Select-Object调用中添加-First 10
参数。
答案 3 :(得分:0)
如果你关心结果集的一些格式化,这里有两个具有更好看的输出的函数:
#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
}
答案 4 :(得分:0)
这是我知道的最快的方法:
$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."
答案 5 :(得分:-1)
将前十大文件放入本地目录的基本文件是使用h来表示人类可读的S排序文件:
ls -Sh -l |head -n 10
或者您可以使用
du -ha /home/directory |sort -n -r |head -n 10