使用 du.exe(Sysinternals)可以显示超过一定大小的文件夹吗?

使用 du.exe(Sysinternals)可以显示超过一定大小的文件夹吗?

du.exe可让您递归识别占用大量空间的文件夹。例如,以下内容将向您显示c:\3 级深度的所有文件夹的大小:

du.exe -l 3 c:\

我如何过滤此输出以仅显示 1GB 以上的文件夹?

以下是输出的摘录,du.exe供参考:

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

   6,344,864  c:\Windows\winsxs
  18,268,671  c:\Windows
 483,343,308  c:\
Files:        412125
Directories:  42072
Size:         494,943,548,281 bytes
Size on disk: 487,560,269,896 bytes

答案1

我提供了以前的du/powershell组合的新变体,只是因为它们都不适用于duv1.61,其他人可能会遇到同样的问题。我在使用以前的变体时遇到了一些问题:

  1. du-nobanner需要包含开关(但没有),这样才ConvertFrom-Csv不会阻塞顶部的横幅(对我来说,表现为神秘的隐形输出)
  2. 即使那样,powershell 也会返回例如Cannot convert value "40822284152" to type "System.Int32". Error: "Value was either too large or too small for an Int32."某些行;大概是非常大的目录。
  3. 最后,输出将包含非常小的目录,远低于 1GB,尽管存在Where-Object { [int]$_.DirectorySize -gt 1048576 }

我不是 powershell 专家,但我已经设法调整前两种变体以提供可行的解决方案:

du -nobanner -c -l 3 \ | ConvertFrom-Csv | select Path,@{Name="DirectorySize";expression={$_.DirectorySize / 1GB }} | Where-Object { $_.DirectorySize -gt 1 } | Sort-Object { $_.DirectorySize } -descending

只是为了好玩,这里有一个不太灵活/不太精确的解决方案,使用dufindstr正则表达式:

du -l 3 \ | findstr /R /C:",[0-9][0-9][0-9],[0-9][0-9][0-9]  "

这利用了目录1GB打印的模式。具体来说,在三位数字前会有一个额外的前导逗号,然后是另一个逗号,后面跟着三位数字。后面的两个空格是过滤打印在底部的总数所必需的。注意:此解决方案不像 powershell 解决方案那样按目录大小排序。

答案2

正如另一个答案所说,您无法du.exe独自完成此操作。PowerShell 来救援!

.\du.exe -c -l 3 C:\ | ConvertFrom-Csv -Header Size,Path | Where-Object { [int]$_.Size -gt 1048576 } | Sort-Object { [int]$_.Size } -descending

解释

把这个长命令分解成各个位,每个位都输入到下一个命令中:

.\du.exe -c -l 3 C:\

这基本上就是您开始时所做的,只是-c参数指示du将输出格式化为 CSV。

ConvertFrom-Csv -Header Size,Path

这将获取 CSV 输出du并将其转换为 PowerShell 哈希表。由于du没有提供带有列名的标题,因此必须手动完成。

Where-Object { [int]$_.Size -gt 1048576 }

这将过滤数据,仅返回大小大于 1 GB 的行(du返回大小以 KB 为单位,1 GB = 1048576 KB)。请注意该[int]部分,让 PowerShell 知道它正在处理数字数据。

Sort-Object { [int]$_.Size } -descending

这将按大小降序对数据进行排序(再次指定要排序的数据是数字)。当然,这是可选的。

答案3

在最新的 du.exe 版本中,使用 Powershell ConvertFrom-Csv 附加标头无法立即使用,因为 du.exe 会在列表中附加自己的标头。我们需要做的是使用 select 命令选择现有标头。

du.exe -c -l 3 C:\ | ConvertFrom-Csv | select Path,DirectorySize | Where-Object { [int]$_.DirectorySize -gt 1048576 }

答案4

如果 du 位于 System32 中,则 cmd.exe 的最新答案:

du -l 3 * | findstr /R /C:",[0-9][0-9][0-9],[0-9][0-9][0-9]  " | sort

虽然会花费更多时间,但会给你你想要的东西,我喜欢 1 深度。

du -l 1 * | findstr /R /C:",[0-9][0-9][0-9],[0-9][0-9][0-9]  " | sort
  • STAR-将检索当前目录

您可以将其与 jimadine 之前的回答结合起来,以设置 doskey 命令。

DOSKEY sz=du -l $1 * | findstr /R /C:",[0-9][0-9][0-9],[0-9][0-9][0-9]  " | sort

用法是

sz <search depth>

相关内容