我很想编写一个 bash 脚本来帮助我找到减少磁盘使用的机会。
该脚本将接受 2 个参数:一个父文件夹(对我来说通常是
/apps/
)和一个阈值(例如“200M”)。
我当前的方法并不理想(不使用阈值并显示大量冗余输出)。
目前我运行
cd /apps/ && du -aBM 2>/dev/null | sort -nr | head -n 15
并看到如下输出:
8975M .
1448M ./delta
1387M ./alpha
1350M ./alpha/releases
1144M ./bravo/releases
1144M ./bravo
1137M ./charlie
1117M ./delta/releases
902M ./alpha/releases/202210091311
871M ./charlie/releases
796M ./echo
794M ./echo/releases
791M ./alpha/releases/202210091311/node_modules
703M ./scoreboard
684M ./scoreboard/node_modules
我希望输出省略如下行:
8975M .
1448M ./delta
1387M ./alpha
1350M ./alpha/releases
1144M ./bravo
1137M ./charlie
902M ./alpha/releases/202210091311
796M ./echo
703M ./scoreboard
因为这些浪费了我的注意力,因为上面的输出还包括那些高于我关心的阈值(200M)的文件夹的子文件夹。
这些是更有趣的台词:
1144M ./bravo/releases
1117M ./delta/releases
871M ./charlie/releases
794M ./echo/releases
791M ./alpha/releases/202210091311/node_modules
684M ./scoreboard/node_modules
不过,我认为
du -aBM 2>/dev/null | sort -nr
方法不是实现我的实际目标的正确起点。
因为实际上,也许任何那些文件夹(在我最近的示例中)甚至没有达到应有的嵌套/深度(也满足 200 MB 阈值的最低级别子文件夹)。
例如,也许
/echo/subfolder1
和 /echo/subfolder2
各为 300M。
我的云服务器磁盘空间有限,不想支付更多费用。
我还没有认真思考过这个问题,所以逻辑可能不正确。
假设
du
的输出始终是深度优先。
如果已经看到某个关卡,我们不需要打印任何内容。否则,打印并标记级别和所有父级。
du -aBM /top 2>/dev/null |
awk -FM '$1>200' |
awk -F/ -v OFS=/ '
{
orig = $0
sub(/^[0-9]+M[ \t]+/,"")
for (shown=0; NF>0; --NF)
if ( !($0 in seen) ) {
if (!shown++) print orig
seen[$0]
}
}
'