找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 19|回复: 1

磁盘清道夫sdcard 垃圾一键清理

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式
磁盘清道夫sdcard 垃圾一键清理

QQ截图20261104091552.png

QQ截图20261104091539.png

QQ截图20261104091528.png

  1. /**
  2. * 案例32:磁盘清道夫——/sdcard 垃圾一键清理
  3. *
  4. *
  5. * 为什么有用:云手机/模拟器盘小,截图、安装包、缓存堆几个月就满盘;
  6. *            这脚本不是演示玩具,运维的人真拿来一天跑一次。
  7. * 原理:adb.exec 跑 df(磁盘用量)/du(大目录扫描)/find(按规则找垃圾)/rm(删)
  8. *      四条 shell,全部以 App 自身 uid 执行,免 root(案例30已锤 adb.exec 通道)。
  9. *      释放总量直接对比清理前后 df,不逐文件算账,又快又准。
  10. * 安全带:实删=false 默认演练,只列清单不动手;确认无误改 true 才真删。
  11. *        只碰三类垃圾:老截图 / 残留APK / 老压缩包,绝不动通讯录、照片、App数据。
  12. *
  13. * 用法:直接运行看演练报告 → 检查列出的文件没问题 → 实删 改 true 再跑一次。
  14. *      可配合案例26定时闭环,每天凌晨自动清盘。
  15. */

  16. // ========== 配置区 ==========
  17. var 实删 = false;            // ★演练开关:false=只列清单;true=真删
  18. var 截图保留天数 = 7;        // DCIM 里比这更早的截图算垃圾
  19. var 压缩包保留天数 = 3;      // Download 里比这更早的 zip 算垃圾
  20. var 扫描大目录 = true;       // 是否 du 扫 /sdcard 顶层大目录(慢机可能要等几十秒)
  21. var 大目录阈值KB = 51200;    // 只列超过 50MB 的目录

  22. // 垃圾规则(toybox find 语法:-type f -name 样式 -mtime +天数)
  23. var 规则列表 = [
  24.     { 名: "老截图", 目录: "/sdcard/DCIM",     找: "-type f -name "*.jpg" -mtime +" + 截图保留天数 },
  25.     { 名: "残留APK", 目录: "/sdcard/Download", 找: "-type f -name "*.apk"" },
  26.     { 名: "老压缩包", 目录: "/sdcard/Download", 找: "-type f -name "*.zip" -mtime +" + 压缩包保留天数 }
  27. ];

  28. // ========== adb 通道(案例30锤死:返回JSON包 {errorMsg, success}) ==========
  29. function adb跑(命令) {
  30.     try {
  31.         var 数据 = JSON.parse(adb.exec(命令, false));
  32.         return {
  33.             成: 数据.success == null ? "" : ("" + 数据.success),
  34.             错: 数据.errorMsg == null ? "" : ("" + 数据.errorMsg).trim()
  35.         };
  36.     } catch (e) { return { 成: "", 错: "exec异常 " + e }; }
  37. }

  38. // ========== df:磁盘用量(取最后一行数字列:总/已用/可用/使用率) ==========
  39. function 查df() {
  40.     var r = adb跑("df -k /sdcard");
  41.     var m = r.成.match(/(\d+)\s+(\d+)\s+(\d+)\s+(\d+)%/);
  42.     if (m == null) return null;
  43.     return {
  44.         总MB: Math.round(m[1] / 1024),
  45.         已用MB: Math.round(m[2] / 1024),
  46.         可用MB: Math.round(m[3] / 1024),
  47.         用率: m[4] + "%"
  48.     };
  49. }

  50. // ========== du:顶层大目录排行(输出行"KB数+Tab+路径",JS里排序) ==========
  51. function 扫大目录() {
  52.     var r = adb跑("du -d 1 -k /sdcard");
  53.     var 行 = r.成.split("\n");
  54.     var 表 = [];
  55.     for (var i = 0; i < 行.length; i++) {
  56.         var m = 行[i].match(/^(\d+)\s+(\/\S.*)$/);
  57.         if (m != null) {
  58.             var kb = parseInt(m[1], 10);
  59.             if (kb >= 大目录阈值KB) 表.push([m[2], kb]);
  60.         }
  61.     }
  62.     表.sort(function (a, b) { return b[1] - a[1]; });
  63.     return 表;
  64. }

  65. // ========== find:按规则找垃圾文件清单 ==========
  66. function 找垃圾(规则) {
  67.     var r = adb跑("find " + 规则.目录 + " " + 规则.找);
  68.     if (r.成 === "") return [];
  69.     var 行 = r.成.split("\n");
  70.     var 表 = [];
  71.     for (var i = 0; i < 行.length; i++) {
  72.         var s = 行[i].trim();
  73.         if (s.indexOf("/sdcard") === 0) 表.push(s);   // 过滤掉报错行,只留真路径
  74.     }
  75.     return 表;
  76. }

  77. // ========== rm:删单个文件 ==========
  78. function 删文件(路径) {
  79.     var r = adb跑("rm -f " + 路径);
  80.     return r.错 === "";
  81. }

  82. // ========== 主流程 ==========
  83. function main() {
  84.     printl("=== 案例32 磁盘清道夫 启动:模式=" + (实删 ? "★实删" : "演练(只报不删)") + " ===");

  85.     var 前df = 查df();
  86.     if (前df == null) {
  87.         printl("❌ df 都跑不动,adb.exec 通道异常:" + adb跑("df -k /sdcard").错);
  88.         return;
  89.     }
  90.     printl("💾 清理前:总 " + 前df.总MB + "MB | 已用 " + 前df.已用MB + "MB(" + 前df.用率 + ") | 可用 " + 前df.可用MB + "MB");

  91.     if (扫描大目录) {
  92.         printl("🔎 du 扫 /sdcard 顶层大目录(≥" + Math.round(大目录阈值KB / 1024) + "MB),慢机稍等...");
  93.         var 大 = 扫大目录();
  94.         if (大.length === 0) printl("   (没扫到大目录,不影响清理)");
  95.         for (var i = 0; i < 大.length && i < 8; i++) {
  96.             printl("   " + (i + 1) + ". " + 大[i][0] + " ≈" + Math.round(大[i][1] / 1024) + "MB");
  97.         }
  98.     }

  99.     var 总可清 = 0;
  100.     for (var j = 0; j < 规则列表.length; j++) {
  101.         var 规则 = 规则列表[j];
  102.         var 垃圾 = 找垃圾(规则);
  103.         总可清 += 垃圾.length;
  104.         printl("🧹 [" + 规则.名 + "] 命中 " + 垃圾.length + " 个 ← " + 规则.目录);
  105.         for (var k = 0; k < 垃圾.length && k < 5; k++) printl("      " + 垃圾[k]);
  106.         if (垃圾.length > 5) printl("      ...其余 " + (垃圾.length - 5) + " 个省略");

  107.         if (实删) {
  108.             var 删成 = 0, 跳过 = 0;
  109.             for (var t = 0; t < 垃圾.length; t++) {
  110.                 if (垃圾[t].indexOf(" ") >= 0) { 跳过++; continue; }  // 带空格路径跳过,防参数劈叉
  111.                 if (删文件(垃圾[t])) 删成++;
  112.             }
  113.             printl("      ✅ 实删 " + 删成 + " 个" + (跳过 > 0 ? ",跳过带空格 " + 跳过 + " 个" : ""));
  114.         }
  115.     }

  116.     if (!实删) {
  117.         printl("📋 演练完毕:共可删 " + 总可清 + " 个文件。");
  118.         printl("💡 检查上面清单没误伤 → 把 实删 改 true 再跑一次就真清盘");
  119.     } else {
  120.         var 后df = 查df();
  121.         if (后df != null) {
  122.             var 释放 = 后df.可用MB - 前df.可用MB;
  123.             printl("💾 清理后:可用 " + 后df.可用MB + "MB(" + 后df.用率 + ")");
  124.             printl("🎉 本次释放 " + (释放 > 0 ? 释放 + " MB" : "不足 1MB(删的都是小文件)"));
  125.         }
  126.     }
  127.     printl("=== 案例32 收工 ===");
  128. }

  129. main();
复制代码


0

主题

5

回帖

10

积分

软件网站新手

积分
10
发表于 半小时前 | 显示全部楼层

磁盘清道夫sdcard 垃圾一键清理

这个脚本挺实用的,特别是对于云手机或者模拟器来说,盘子小了之后容易满。我试了一下,确实能一键清理 /sdcard 上的旧截图、残留的APK和压缩包,挺方便的。不过我有个疑问,清理的时候怎么保证不会误删重要的文件呢?安全措施做得怎么样?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-5 07:20

安卓脚本软件 · 键鼠盒子 · HID · 机械臂

快速回复 返回顶部 返回列表

随机推荐 · 热帖 / 新帖 / 随便看看

社区会员(随机展示)