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
组合的新变体,只是因为它们都不适用于du
v1.61,其他人可能会遇到同样的问题。我在使用以前的变体时遇到了一些问题:
du
-nobanner
需要包含开关(但没有),这样才ConvertFrom-Csv
不会阻塞顶部的横幅(对我来说,表现为神秘的隐形输出)- 即使那样,powershell 也会返回例如
Cannot convert value "40822284152" to type "System.Int32". Error: "Value was either too large or too small for an Int32."
某些行;大概是非常大的目录。 - 最后,输出将包含非常小的目录,远低于 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
只是为了好玩,这里有一个不太灵活/不太精确的解决方案,使用du
和findstr
正则表达式:
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>