如何清理Mac磁盘空间

清理的原因

  1. 硬盘不够用

  2. 电脑运行时会产生大量的垃圾,并且其中很大部分不会被自动删除

下面是典型的几种产生不会自动被删除的数据的原因:

.1. App被卸载了,但配置、数据和缓存没有被删除

Mac App被直接删除(将 /Applications/XXX.app 移动到垃圾箱)时,它的配置、应用数据和缓存是不会删除的。 这些数据永久的被留了下来。

直接删除App的残留文件
~/Library/Preferences/${App的名字} (1)
~/Library/Application Support/${App的名字}
~/Library/Caches/${App的名字}
1 App未必总是把数据存在自己的app名字的文件夹内,也可能是包名、公司名
使用CleanMyMac卸载App,则会把配置数据缓存一同删除

.2. App升级时遗留了旧版的配置、数据和缓存

有些App在大版本(Major Version)升级的时候,为了让老版本和新版本可以共存,用于配置、数据、缓存的目录名会更换。从而导致老的数据被永久遗留,成为"野数据"(类似野指针:不再被使用,也不会有程序会主动删除)。

比如Intellij IDEA的2018.1版本的配置目录是:

~/Library/Preferences/IntellijIDEA2018.1

升级到2018.2之后则是:

~/Library/Preferences/IntellijIDEA2018.2

之前版本的数据就一直被遗留在电脑中。

.3. 不会被删除的缓存

很多App,只写了产生缓存的逻辑,并没有写删除缓存的逻辑。抑或者只会删除当前版本的缓存,旧的就不处理了。这一点在日志文件上更为常见,只管新建日志,过期的日志从来不删。

例如,Gradle会产生大量的缓存(往往可以到数十G),低版本完全没有删除的逻辑,新版本也删除的不全面并且不处理旧版的数据。

Jetbrains IDE也有同样的问题,产生的日志从来不删,尤其是出错时的dump文件,体积大并且不删。同时Jetbrains对源码索引生成的缓存的体积也似乎从来不减小,可能也没有删除逻辑。

.4. App运行数据里的野数据

有些App会产生很多信息写入数据库,但未必写了相应的逻辑清理,数据库不会存在缓存里,所以清理缓存也清理不掉。最后表现为, 使用App里的清理缓存工具把一切数据都清理了,仍然占用空间很大。最明显的就是腾讯的微信和QQ。

微信和QQ刚刚安装后仅几百M,但使用时间长之后就变成了几G甚至10来G,它们都自带数据清理功能,但你尽管清缓存,删聊天记录,全删完了也还是占几个G。 这说明它们运行时产生的文件早已变成了野数据,app自身都不记得创建了哪些文件,它更是不可能记得去删除。

这种情况最好的办法就是导出或者备份聊天记录,然后整个重置App的数据,然后重新登陆,导入聊天记录。

清理的工具

CLI工具

在终端中使用如下命令可以列出当前目录下各个文件夹占用的空间:

du -hd1 | gsort -h
du

是unix上用于查看磁盘占用情况的工具

-h

参数指定输出的数据大小更易读

-d1

指定只输出一层目录的信息

| gsort -h

是将前面命令的输出按数据大小排序

GUI

CleanMyMac是一个很好用的Mac清理App。有很多功能可以用来代替手工查找和删除垃圾文件。

缓存清理

CleanMyMac可以找出所有GUI的Mac App的缓存文件,使用它可以解决大部分的缓存。但使用时需要注意:

不要默认清除所有找到的缓存

CleanMyMac会默认勾选所有找到的缓存。 但其实不是所有的缓存都过期了,清空有用的缓存会导致以后App加载变慢。

例如IDE产生的缓存大部分是对源码的索引,如果你平时开发的项目没有很大变更,没有必要去删除IDE的缓存。

不要频繁的清空缓存

缓存是一个有用的东西,所以尽量少清理:

  1. 如果你硬盘空间很充足,就完全没有必要清理

  2. 如果你上次清理还没过去多久,也没必要清理

CleanMyMac清理的并不全面

CleanMyMac只支持按标准开发的Mac GUI App和少数常见的cli工具的缓存。使用这个清理之后,如果空间仍然不足,你仍然需要进一步手工清理垃圾文件。

App卸载

CleanMyMac删除App会一同删除配置,数据和缓存。

Space Lens

手工清理垃圾的时候,最重要的就是有的放矢:找出空间最主要被消耗的地方。

一个200M的文件夹,里面就算全部是垃圾,你找出来清空,最多只能释放200M空间。 但是一个80G的文件夹,里面能释放的空间就多了。所以使用du命令的时候,要按大小排序,去最占空间的文件夹里找,每次都是先清理完最大的位置再继续找次要的。

CleanMyMac的Space Lens是这个思路的GUI解决方案。

清理的目标

.1. 选择性的清理缓存

建议首先使用CleanMyMac之类的清理工具:清理App一般都能找出大部分的缓存

缓存是有用的,删除缓存会让程序加载都变慢。但如果你能判断缓存有大部分不再需要的时候,就需要清理了。

例如,在使用了很长时间之后,一定有大量的缓存是无用的,所以隔较长的一段时间后,就可以考虑清理缓存了。

在比如,某次工作需要,使用IDE打开了一个非常庞大的开源项目,往往IDE会为这数G的源码建立索引,产生几G的缓存。如果你事后删了这个项目,或短期都不会再需要打开这个项目,你就可以把IDE的缓存清除一遍。

.2. 完全删除不会再使用的过期数据

清理App无法识别不再使用的数据
建议按占空间分布查找体积大的老数据(借助du或者CleanMyMac的Space Lens功能)

不再使用的App,旧版的App的数据,全部可以删除。

.3. 清理或者压缩用途不大的用户数据

清理App无法识别用途不大的用户数据
建议按占空间分布查找体积大的老数据(借助du或者CleanMyMac的Space Lens功能)

有很多用户数据占体积并且不再有用,比如一年前下载的Windows安装镜像,很长时间时间没再用的虚拟机。这些都是用户数据,所以任何清理软件都无法帮你清除, 只有你自己才知道这些东西究竟还有没有用。

常见可清除文件

可完全删除的文件夹
  • ~/.gradle/daemon/

  • ~/.sbt

  • ~/.npm

  • ~/.ivy2

  • ~/.gem

  • ~/.lldb

  • ~/.m2

  • ~/.dartServer

选择性清除不再需要的版本
  • /Library/Java/JavaVirtualMachines/

  • ~/.gradle/wrapper/dists

  • ~/.android/avd

  • ~/Library/Android/sdk/system-images

不再需要的旧版App,或定期重装的App数据
  • ~/Library/Containers/com.tencent.xinWeChat

  • ~/Library/Containers/com.tencent.qq

  • ~/Library/Containers/com.docker.docker

  • ~/Library/Application Support/IntelliJIdeaXXXX

  • ~/Library/Application Support/AndrodiStudioXXXX

清空缓存
  • ~/.gradle/caches

  • ~/Library/Caches/IntelliJIdeaXXXX

  • ~/Library/Caches/AndrodiStudioXXXX