如何使用PowerShell进行du - ish分析?我想定期检查磁盘上目录的大小。
以下给出了当前目录中每个文件的大小:
foreach ($o in gci)
{
Write-output $o.Length
}
但我真正想要的是目录中所有文件的聚合大小,包括子目录。此外,我希望能够按大小排序,可选。
答案 0 :(得分:28)
“探索美丽语言”博客上有一个实现:
"An implementation of 'du -s *' in Powershell"
function directory-summary($dir=".") {
get-childitem $dir |
% { $f = $_ ;
get-childitem -r $_.FullName |
measure-object -property length -sum |
select @{Name="Name";Expression={$f}},Sum}
}
(博客所有者代码:Luis Diego Fallas)
输出:
PS C:\Python25> directory-summary Name Sum ---- --- DLLs 4794012 Doc 4160038 include 382592 Lib 13752327 libs 948600 tcl 3248808 Tools 547784 LICENSE.txt 13817 NEWS.txt 88573 python.exe 24064 pythonw.exe 24576 README.txt 56691 w9xpopen.exe 4608
答案 1 :(得分:20)
我稍微修改了答案中的命令以按大小降序排序,并以MB为单位包含大小:
gci . |
%{$f=$_; gci -r $_.FullName |
measure-object -property length -sum |
select @{Name="Name"; Expression={$f}},
@{Name="Sum (MB)";
Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } |
sort Sum -desc |
format-table -Property Name,"Sum (MB)", Sum -autosize
输出:
PS C:\scripts> du
Name Sum (MB) Sum
---- -------- ---
results 101.297 106217913
SysinternalsSuite 56.081 58805079
ALUC 25.473 26710018
dir 11.812 12385690
dir2 3.168 3322298
也许它不是最有效的方法,但它有效。
答案 2 :(得分:2)
在以前的答案的基础上,此方法适用于希望以KB,MB,GB等形式显示大小,并且仍然能够按大小排序的对象。要更改单位,只需将“ Name”和“ Expression =“中的“ MB”更改为所需的单位。您还可以通过更改“ 2”来更改要显示(四舍五入)的小数位数。
function du($path=".") {
Get-ChildItem $path |
ForEach-Object {
$file = $_
Get-ChildItem -File -Recurse $_.FullName | Measure-Object -Property length -Sum |
Select-Object -Property @{Name="Name";Expression={$file}},
@{Name="Size(MB)";Expression={[math]::round(($_.Sum / 1MB),2)}} # round 2 decimal places
}
}
这将大小作为数字而不是字符串(从另一个答案中可以看出),因此可以按大小排序。例如:
PS C:\Users\merce> du | Sort-Object -Property "Size(MB)" -Descending
Name Size(MB)
---- --------
OneDrive 30944.04
Downloads 401.7
Desktop 335.07
.vscode 301.02
Intel 6.62
Pictures 6.36
Music 0.06
Favorites 0.02
.ssh 0.01
Searches 0
Links 0
答案 3 :(得分:1)
function Get-DiskUsage ([string]$path=".") {
$groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } }
foreach ($dn in $groupedList) {
New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum }
}
}
我有点不同;我将directoryname上的所有文件分组,然后遍历每个目录的列表构建总计(包括子目录)。
答案 4 :(得分:0)
如果您只需要该路径的总大小,则可以使用一个简化版本,
Get-ChildItem -Recurse ${HERE_YOUR_PATH} | Measure-Object -Sum Length
答案 5 :(得分:0)
使用以前的答案我自己的看法:
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const config = require('config');
const jwt = require('jsonwebtoken');
const auth = require('../../middleware/auth');
const User = require('../../models/User');
//@action POST api/auth
//@descr auth user
//@access Public
router.post('/', (req, res) => {
const { email, password } = req.body
if( !email || !password ) {
return res.status(400).json({ msg: "Enter all fields."});
}
User.findOne({ email })
.then(user => {
if(!user) return res.status(400).json({ msg: "Nessun profilo trovato con questa email"});
bcrypt.compare( password, user.password )
.then(isMatch => {
if(!isMatch) return res.status(400).json({ msg: "Password errata!"});
jwt.sign(
{ id: user.id },
config.get('jwtSecret'),
{ expiresIn: 10800 },
(err, token) => {
if(err) throw err;
res.json({
token,
user: {
id: user.id,
name: user.name,
surname: user.surname,
email: user.email,
userPlus: user.userPlus
}
})
}
)
})
})
});
//@action GET api/auth/user
//@descr GET user data
//@access Private
router.get('/user', auth, (req, res) => {
User.findById(req.user.id)
.select('-password')
.then(user => res.json(user));
});
module.exports = router;