在 debian/ubuntu 系统中,dpkg -l 直读底层数据库,可列出所有已安装包(含 rc 状态残留),而 apt list --installed 仅显示 apt 认为已安装的包,更贴近用户视角但可能遗漏手动安装的 .deb 包。

没有统一命令,得看你的系统用的是哪种包管理器——查不到不是命令写错了,是根本没走那个包管理器装的。
dpkg -l 和 apt list --installed 在 Debian/Ubuntu 系统里怎么选
dpkg -l 直读底层数据库,能列出所有已安装包(包括状态为 rc 的残留配置),但输出含状态码(如 ii 表示已安装并配置),需要过滤才干净;apt list --installed 走 APT 高层接口,只显示“当前被 APT 认为已安装”的包,对自动安装的依赖也一并包含,更贴近用户视角。
- 查某个包是否真在系统里:
dpkg -l | grep '^ii' | grep nginx比apt list --installed | grep nginx更可靠,因为后者可能漏掉手动 dpkg -i 安装的 .deb 包 - 统计总数时,
apt list --installed | wc -l通常比dpkg -l | grep '^ii' | wc -l少几行——差的就是那些rc状态的旧配置残留 - 想只看用户主动装的(非依赖):
apt list --installed --manual-installed,dpkg没这个语义,得靠apt-mark showmanual配合
rpm -qa 和 dnf list installed 在 RHEL/CentOS/Fedora 系统里的差异
rpm -qa 是原始数据库快照,不区分来源(哪怕你 rpm -ivh 装了个第三方包,它也会出现在列表里);dnf list installed 只显示由 DNF(或 YUM)管理的包,会过滤掉手动 rpm 安装、未签名或 repo 不匹配的包。
- 查包是否完整安装:
rpm -qi package-name能看到安装时间、签名、文件列表;dnf info package-name则额外显示仓库来源和依赖树 - 想排除构建工具链等开发包:
rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}\n' | grep -v '\-devel$',dnf没直接等价参数,得用dnf repoquery --installed --qf "%{name}-%{version}-%{release}" -
rpm -qa输出无序,长列表建议加| sort | less;dnf list installed默认按字母排好,但不支持分页,要自己加| less
pacman -Q 在 Arch Linux 中为什么不能直接替代 dpkg/rpm
pacman -Q 只管 pacman 本地数据库里的记录,完全不感知 AUR 手动编译安装、make install 或二进制 tarball 解压到 /usr/local 的软件——这些在 Arch 里就是“不存在于包管理器中”,pacman 压根不会返回它们。
- 查显式安装(非依赖)用
pacman -Qe,查依赖包用pacman -Qd,混在一起查用pacman -Q -
pacman -Qs keyword是搜索已安装包的名称和描述,不是全文检索,不支持正则,大小写敏感 - 版本号格式固定为
name-version-release,但pacman -Qi package显示的Version字段不含release,容易和pacman -Q输出对不上
源码安装或二进制包怎么确认软件是否存在
这类软件包管理器“看不见”,只能靠运行时线索反推。别指望 dpkg -S 或 rpm -qf 能查到,它们只认自己数据库里的记录。
- 先定位可执行文件:
command -v nginx或which python3,注意有些命令是 shell 函数或 alias,type -a xxx更准 - 再查归属(仅限包管理器安装的):
dpkg -S /usr/bin/curl(Debian)、rpm -qf /usr/bin/ls(RHEL)、pacman -Qo /usr/bin/vim(Arch) - 如果路径在
/usr/local/bin或~/bin,大概率是源码或二进制安装,此时看ls -l /usr/local/bin/xxx的创建时间、用strings /usr/local/bin/xxx | grep -i version挖版本字符串
真正麻烦的是混合安装场景:比如用 apt 装了 python3,又用 pyenv 装了另一个版本,还从官网下了个 java 二进制包——这时候 apt list --installed、dpkg -l、which java 返回的都不是同一套东西,得根据你要验证的目标来决定用哪个命令。











