You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何apt remove命令会尝试删除匹配包名模式的文件?

为何apt remove命令会尝试删除匹配包名模式的文件?

你遇到的这个问题本质是**Shell的通配符扩展(Globbing)**在起作用,不是apt本身的问题,咱们一步步拆解来看:

问题根源:Shell先处理通配符

当你在终端输入带*这类通配符的命令时,Shell会先于apt执行通配符匹配:

  • 如果当前目录下存在文件名匹配virtualbox*的文件,Shell会把virtualbox*替换成具体的文件名列表,再把替换后的内容传给apt。
  • 如果当前目录下没有匹配的文件,Shell才会把virtualbox*原封不动地传给apt,由apt自己去匹配系统中已安装的包名。

对应你的场景分析

  1. 在有virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb的目录执行命令
    Shell会把virtualbox*扩展成这个deb文件的全名,实际执行的命令变成:

    sudo apt remove virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb
    

    而apt会把这个文件名当成包名去系统里查找,自然找不到对应的包,所以抛出E: Unable to locate package的错误。

  2. 在空目录或无匹配文件的目录执行命令
    Shell找不到匹配virtualbox*的文件,就直接把virtualbox*传给apt,apt会自己匹配所有以virtualbox开头的已安装包,所以能正常执行删除操作。

  3. 有virtualbox.adoc文件的目录实验
    同样的道理,Shell把virtualbox*扩展成virtualbox.adoc,apt找不到名为virtualbox.adoc的包,因此报错。

解决方法

要避免Shell提前扩展通配符,有两种简单的方式:

  • 用引号包裹模式:把virtualbox*放在单引号或双引号里,让Shell把它当成普通字符串传递给apt:
    sudo apt remove 'virtualbox*'
    
  • 切换到无匹配文件的目录执行命令:比如回到你的主目录cd ~,再执行sudo apt remove virtualbox*,此时Shell不会扩展通配符,命令就能正常工作。

备注:内容来源于stack exchange,提问作者Manuel Jordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:09:35