linux没有统一命令列出所有已安装软件,必须先用dpkg、rpm、pacman或zypper --version判断包管理器类型,再选用对应命令(如apt list --installed、rpm -qa、pacman -q等);源码、snap、flatpak或pip安装的软件需用相应专用命令或路径查找。

没有一个命令能“直接列出所有已安装软件”——因为 Linux 里“已安装”的定义取决于安装方式,不同来源的软件压根不共享同一张清单。
先确认你用的是哪个包管理器,别硬套命令
运行这几个命令,看哪个有输出:
-
dpkg --version有输出 → Debian/Ubuntu 系,走apt或dpkg -
rpm --version有输出 → RHEL/CentOS/Fedora/openSUSE,走rpm/dnf -
pacman --version有输出 → Arch/Manjaro,走pacman -
zypper --version有输出 → openSUSE,走zypper
别信 /etc/os-release 里的 NAME 字段就下结论——有些系统(比如某些云镜像)预装了多个包管理器但只启用一个;现场跑命令最稳。
查不到不是命令错了,是软件根本没走这个包管理器
常见情况和对应查法:
-
apt list --installed | grep -i nginx查不到?试试dpkg -l | grep -i nginx——apt list依赖缓存,dpkg -l直读数据库,更底层 -
rpm -qa | grep docker没结果?运行which docker,如果返回/usr/bin/docker,再试rpm -qf /usr/bin/docker——文件归属比包名模糊匹配更可靠 - 全都没输出,但
command -v curl能定位到二进制?大概率是pip install --user、snap install、flatpak install或源码编译安装的
这时候得换路子:snap list、flatpak list、pip list、或者直接 find /usr/local -name "curl" 2>/dev/null。
grep 加 -i 是刚需,包名大小写真不统一
你搜 nginx 却漏掉 Nginx 或 NGINX,不是运气差,是惯例:
-
apt list --installed | grep -i vim——vim、Vim、vim-gtk都能捕获 -
rpm -qa | grep -i httpd——httpd、httpd-tools、mod_ssl全出来 -
pacman -Qs vim不支持-i,它本身大小写敏感,得输vim或Vim精确匹配
漏判一次,可能就错过关键服务。别省这俩字符。
源码安装或手动解压的软件,系统根本不“认账”
它们不会出现在 dpkg -l、rpm -qa、pacman -Q 任何一张表里:
- 典型路径:/usr/local/bin、/opt、~/bin
- 查法:先
which xxx或command -v xxx定位可执行文件,再ls -l /path/to/binary看是否指向某个源码构建目录 - 卸载时千万别
rm -rf——优先回原解压目录找make uninstall,否则配置文件、数据目录、systemd unit 文件全得手动清
这类软件的存在感靠进程、路径、配置文件维系,而不是包数据库。想“全量统计”,就得接受它天然不可见。











