V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jybox
V2EX  ›  分享创造

我用 Homebrew Cask 中社区维护的规则写了一个软件残留文件清理插件

  •  7
     
  •   jybox ·
    jysperm · 2023-02-21 07:22:26 +08:00 · 3981 次点击
    这是一个创建于 674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前我就在 V2EX 就分享过用 brew uninstall --zap 来清理软件残留,有 39 个人给我点了感谢(地址)。

    我是觉得 Homebrew 里这个社区维护的软件残留列表(或者说清理规则)是非常有价值的,比如我们随便找一个软件,它的 cask 文件 是这样的:

    $ brew cat bitbar
    cask "bitbar" do
      version "1.10.1"
      sha256 "8a7013dca92715ba80cccef98b84dd1bc8d0b4c4b603f732e006eb204bab43fa"
    
      url "https://github.com/matryer/bitbar/releases/download/v#{version}/BitBar.app.zip"
      name "BitBar"
      desc "Utility to display the output from any script or program in the menu bar"
      homepage "https://github.com/matryer/bitbar/"
    
      app "BitBar.app"
    
      zap trash: [
        "~/Library/BitBar Plugins",
        "~/Library/Caches/com.matryer.BitBar",
        "~/Library/Preferences/com.matryer.BitBar.plist",
      ]
    end
    

    其中 zap 部分就是需要清理的遗留文件。

    于是我做了一个插件可以一键扫描 Homebrew Cask 中所有软件(目前支持其中约 3400 个)的 cask 文件中的路径,找出已卸载软件的遗留文件:

    项目的源代码在 https://github.com/jysperm/homebrew-leftover-scanner

    安装:

    brew tap jysperm/leftover-scanner
    

    开始扫描:

    brew scan-leftovers
    

    这个插件本身并不会删除任何文件,而是会打印出列表并引导你使用 brew uninstall 来删除,所以不必担心误删。

    26 条回复    2023-03-01 00:57:19 +08:00
    steveshi
        1
    steveshi  
       2023-02-21 08:08:23 +08:00
    666 这个确实很强,不过会莫名其妙扫出来我安装的 mpv 和 pycharm
    Yuusha
        2
    Yuusha  
       2023-02-21 08:26:05 +08:00 via iPhone
    这个很需要
    artee
        3
    artee  
       2023-02-21 08:28:51 +08:00
    ```
    ❯ brew scan-leftovers
    ==> 0 casks to scan ...
    ==> Installed from cask:

    ==> Installed from other ways:
    ```

    这是和 `homebrew` 使用 json 来更新包有关系?
    hcsu
        4
    hcsu  
       2023-02-21 08:30:13 +08:00
    谢谢
    jybox
        5
    jybox  
    OP
       2023-02-21 08:30:51 +08:00
    @artee 看起来可能是你没有使用过 Homebrew Cask ?所以本地没有 Cask 的数据库(它叫 Tap )。
    artee
        6
    artee  
       2023-02-21 08:41:22 +08:00   ❤️ 1
    ```
    ❯ brew list --cask
    alacritty font-lxgw-wenkai omniplan
    android-studio font-ubuntu-mono-nerd-font openmtp
    anki font-ubuntu-nerd-font raycast
    bartender fork shottr
    calibre google-chrome sloth
    chatgpt handbrake squirrel
    clashx-pro iina stretchly
    dash insomnia telegram
    drawio intellij-idea temurin
    firefox iterm2 topnotch
    fluor keka typora
    font-dejavu-sans-mono-nerd-font microsoft-office visual-studio-code
    font-fira-code-nerd-font microsoft-remote-desktop wireshark
    font-fira-mono-nerd-font obsidian zerotier-one
    font-jetbrains-mono-nerd-font omnigraffle zoom
    ```

    并不是,https://brew.sh/2023/02/16/homebrew-4.0.0/ 开始就可以不要下载 cask 的 git repo 了
    @jybox
    jybox
        7
    jybox  
    OP
       2023-02-21 08:45:25 +08:00
    好吧,原来 4.0.0 是上周才发布的,看来需要适配一下
    Ritter
        8
    Ritter  
       2023-02-21 09:25:17 +08:00
    Error: Unable to remove some files. Please enable Full Disk Access for your terminal under System Preferences → Security & Privacy → Privacy → Full Disk Access.
    Error: exit
    要打开完全访问么 应该选择哪个应用程序
    jybox
        9
    jybox  
    OP
       2023-02-21 10:20:06 +08:00
    @Ritter 开给你你的 Terminal
    Achieve7
        10
    Achieve7  
       2023-02-21 10:22:17 +08:00
    上周 Homebrew 更新了 4.0.x, 貌似需要适配一下
    guanguans
        11
    guanguans  
       2023-02-21 10:29:57 +08:00
    这个很有用,已 star 。
    Abirdcfly
        12
    Abirdcfly  
       2023-02-21 10:30:52 +08:00   ❤️ 1
    感谢感谢,大部分情况下是很有用的。

    很小部分情况下似乎有点问题,比如 jetbrains 系列都出现了,但是这些都是通过 https://www.jetbrains.com/toolbox-app/ 正常安装正在使用的。
    SimonOne
        13
    SimonOne  
       2023-02-21 11:05:04 +08:00
    OP ,卸载的软件信息留存在哪的?
    有些软件我在 brew 卸载了,然后单独安装了,也出现了,我想去 brew 了去掉卸载的信息,不然每次扫出来挺难看的。
    hackpro
        14
    hackpro  
       2023-02-21 11:59:08 +08:00
    >>> brew tap jysperm/leftover-scanner
    ==> Tapping jysperm/leftover-scanner
    Cloning into '/usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner'...
    remote: Enumerating objects: 28, done.
    remote: Counting objects: 100% (28/28), done.
    remote: Compressing objects: 100% (20/20), done.
    remote: Total 28 (delta 3), reused 28 (delta 3), pack-reused 0
    Receiving objects: 100% (28/28), 409.01 KiB | 1.36 MiB/s, done.
    Resolving deltas: 100% (3/3), done.
    Tapped 1 command (14 files, 852.5KB).

    >>> brew scan-leftovers
    Error: uninitialized constant CaskUnreadableError
    /usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner/cmd/brew-scan-leftovers.rb:22:in `rescue in block in get_all_casks'
    /usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner/cmd/brew-scan-leftovers.rb:21:in `block in get_all_casks'
    /usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner/cmd/brew-scan-leftovers.rb:20:in `map'
    /usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner/cmd/brew-scan-leftovers.rb:20:in `get_all_casks'
    /usr/local/Homebrew/Library/Taps/jysperm/homebrew-leftover-scanner/cmd/brew-scan-leftovers.rb:77:in `<top (required)>'
    /usr/local/Homebrew/Library/Homebrew/utils.rb:93:in `require'
    /usr/local/Homebrew/Library/Homebrew/utils.rb:93:in `require?'
    /usr/local/Homebrew/Library/Homebrew/brew.rb:95:in `<main>'

    大佬可以帮忙看看是啥问题吗
    SilencerL
        15
    SilencerL  
       2023-02-21 12:24:23 +08:00 via iPhone   ❤️ 1
    看到 OP 遥想当年的 RPHOST……那时候我才初中吧好像,转眼我都快 30 了 mmp ,不过 OP 应该也快 30 了
    zhangxu1621
        16
    zhangxu1621  
       2023-02-21 13:15:21 +08:00
    brew autoremove 不是也可以删除残留的依赖文件的吗
    pota
        17
    pota  
       2023-02-21 14:10:46 +08:00
    卧槽。不扫不知道。之前一直用 appcleaner 还有这么多残留
    ljsh093
        18
    ljsh093  
       2023-02-21 15:28:17 +08:00   ❤️ 1
    报个问题,如果终端分辨率不够宽的话,brew 后面的命令输出不全,出现如 brew unin 的情况
    norcm
        19
    norcm  
       2023-02-21 17:14:28 +08:00
    🐂🍺,有用,感谢 OP !
    zuisong
        20
    zuisong  
       2023-02-21 17:36:23 +08:00
    谢谢, 很有用
    jybox
        21
    jybox  
    OP
       2023-02-22 01:02:51 +08:00   ❤️ 1
    @SimonOne @Abirdcfly
    这个脚本实际上需要先扫描到已安装的软件(会在最开头打印出来),通过 brew 安装的自然是简单;而其他安装来源的话(如官网下载)则是去检查目标路径(一般是 /Applications )下是否有同名的 .app 。所以像 JetBrains Toolbox 这种安装到其他路径(/Library/Application Support/JetBrains/Toolbox )暂时就检测不到了,我再想想有没有其他办法。
    GoRoad
        22
    GoRoad  
       2023-02-22 10:16:22 +08:00   ❤️ 1
    确实会出现命令打印不全的情况,比如 `brew uninstall --cask dbeaver-enterprise` ,只打印到了 `brew uninstall -f --zap dbeaver-enterpr`,而且这种情况挺常见
    Yuusha
        23
    Yuusha  
       2023-02-23 23:25:36 +08:00   ❤️ 1
    确实,经常有出现 brew uni 、brew uninsta 这种情况,希望大佬修复一下
    SimonOne
        24
    SimonOne  
       2023-02-24 11:16:15 +08:00
    @jybox #21 有一个 bug ,我的 clashx pro ( brew 的是 clashx ,不同名)的文件被扫出来是 clashx 的残留,但其实我没装 clashx 。bartender 3 被扫出来有残留,但 bartender 3 是我安装包手动安装的。

    这两个情况在我全新安装系统的 mac mini 也复现了,所以应该不是我先通过 brew 安装软件再卸载再自行安装包安装导致的。
    Comyn
        25
    Comyn  
       2023-02-26 01:33:41 +08:00   ❤️ 1
    很赞,但确实也遇到了命令打印不全的问题,以及已经按提示卸载但还是扫描出来的问题
    jybox
        26
    jybox  
    OP
       2023-03-01 00:57:19 +08:00   ❤️ 1
    @artee 你需要先运行一下 brew tap homebrew/cask 。就像前面有人提到的,Homebrew 4.0 开始不会默认把 cask 仓库 clone 到本地了 ...
    @hackpro 已经修复了,可以运行 brew update 更新到最新版本
    @ljsh093 @GoRoad @Yuusha @Comyn 感谢反馈,最新版本已拆分到两行来解决这个问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5557 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:19 · PVG 16:19 · LAX 00:19 · JFK 03:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.