14人参与 • 2026-03-13 • Linux
在 linux 系统中,查看已安装的软件包是一项基础但极其重要的技能。无论是系统管理员、开发人员,还是普通用户,掌握如何查询当前系统上已安装的软件,都能帮助我们更好地管理环境、排查依赖冲突、进行安全审计或迁移配置。本文将从多个维度深入探讨 linux 下查看已安装软件的方法,涵盖主流发行版(如 ubuntu/debian、centos/rhel、fedora、arch linux 等)的命令行工具、图形界面方式、编程接口调用(含 java 示例)、自动化脚本编写、输出格式处理等内容,并辅以 mermaid 图表和实用外链,助你全面掌握这一核心技能。
在深入技术细节之前,我们先明确“为什么要查看已安装软件”。
小贴士:在生产环境中,建议将软件清单纳入版本控制或配置管理系统(如 ansible、puppet),实现自动化追踪。
linux 世界百花齐放,不同发行版采用不同的包管理系统。以下是主流发行版及其对应的包管理器:
| 发行版系列 | 包管理器命令 | 软件包格式 |
|---|---|---|
| debian / ubuntu | apt, dpkg | .deb |
| red hat / centos | yum, dnf, rpm | .rpm |
| fedora | dnf, rpm | .rpm |
| opensuse | zypper, rpm | .rpm |
| arch linux | pacman | .pkg.tar.zst |
| gentoo | emerge | 源码编译 |
我们将分别介绍它们如何查看已安装软件。
dpkg 是底层的 debian 包管理工具,可列出所有已安装的 .deb 包:
dpkg -l
输出示例:
ii vim 2:8.2.3995-1ubuntu2.4 amd64 vi improved - enhanced vi editor ii curl 7.81.0-1ubuntu1.10 amd64 command line tool for transferring data with url syntax
其中:
ii 表示“已安装且配置完成”更现代的方式是使用 apt 命令:
apt list --installed
该命令输出更简洁,适合脚本处理:
vim/now 2:8.2.3995-1ubuntu2.4 amd64 [installed,local] curl/now 7.81.0-1ubuntu1.10 amd64 [installed,local]
若只想查找某个软件是否安装:
dpkg -l | grep nginx apt list --installed | grep python3
备份当前环境非常有用:
dpkg --get-selections > installed_packages.txt
恢复时:
sudo dpkg --set-selections < installed_packages.txt sudo apt-get dselect-upgrade
rpm 是 red hat 系列的基础包管理器:
rpm -qa
输出示例:
vim-enhanced-8.0.1763-16.el7_9.x86_64 curl-7.29.0-59.el7_9.1.x86_64
可结合 grep 过滤:
rpm -qa | grep httpd
在 centos 7 及更早版本中:
yum list installed
fedora 和 rhel 8+ / centos stream 推荐使用 dnf:
dnf list installed
输出更结构化:
installed packages name version arch repository vim-enhanced 2:8.2.3755-1.fc36 x86_64 @updates curl 7.82.0-7.fc36 x86_64 @updates
rpm -qa > installed_rpm_packages.txt dnf list installed > dnf_installed_list.txt
opensuse 使用 zypper 作为主要包管理器:
zypper se --installed-only
或简写:
zypper search -i
更详细的列表:
zypper packages --installed-only
导出:
zypper packages --installed-only > suse_installed.txt
arch 用户使用 pacman:
pacman -q
仅显示包名和版本:
vim 8.2.4840-1 curl 7.83.1-1
查看详细信息:
pacman -qi vim
导出所有包:
pacman -qq > arch_packages.txt
除了系统原生包管理器,现代 linux 也支持通用打包格式:
snap list
输出:
name version rev tracking publisher notes code 1.78.2 123 latest/stable vscode✓ classic
flatpak list
appimage 无需安装,通常放在 ~/applications 或 ~/bin,无统一管理命令,需手动管理。
下面是一个展示不同发行版与其包管理器之间关系的图表:


此图展示了主流发行版与其对应的包管理器及包格式之间的层级关系,有助于理解整个 linux 软件分发生态。
有时我们需要在 java 应用中动态获取系统已安装的软件信息,比如用于环境检测、日志记录或配置同步。以下是一个完整的 java 示例程序,它会根据当前操作系统类型执行相应的 shell 命令,并输出结果。
import java.io.bufferedreader;
import java.io.inputstreamreader;
import java.util.arraylist;
import java.util.list;
public class linuxpackagechecker {
public static void main(string[] args) {
system.out.println("🔍 正在检测当前系统并获取已安装软件列表...");
string os = system.getproperty("os.name").tolowercase();
if (!os.contains("linux")) {
system.err.println("❌ 当前系统不是 linux,无法执行包管理命令。");
return;
}
string packagemanagercmd = detectpackagemanager();
if (packagemanagercmd == null) {
system.err.println("⚠️ 未识别到支持的包管理器。");
return;
}
system.out.println("✅ 检测到包管理器命令:" + packagemanagercmd);
list<string> installedpackages = executecommand(packagemanagercmd);
if (installedpackages.isempty()) {
system.out.println("📭 未获取到任何已安装软件。");
} else {
system.out.println("📦 已安装软件数量:" + installedpackages.size());
system.out.println("📋 前 10 个软件包:");
installedpackages.stream().limit(10).foreach(system.out::println);
}
}
private static string detectpackagemanager() {
// 尝试执行各包管理器命令,看哪个存在
string[] commands = {
"dpkg -l", // debian/ubuntu
"rpm -qa", // rhel/centos/fedora
"pacman -q", // arch
"zypper search -i", // opensuse
"apt list --installed" // modern debian/ubuntu
};
for (string cmd : commands) {
try {
processbuilder pb = new processbuilder("/bin/sh", "-c", "command -v " + cmd.split(" ")[0]);
process process = pb.start();
bufferedreader reader = new bufferedreader(new inputstreamreader(process.getinputstream()));
string line = reader.readline();
if (line != null && !line.trim().isempty()) {
return cmd; // 返回第一个可用的命令
}
} catch (exception e) {
// 忽略异常,继续尝试下一个
}
}
return null;
}
private static list<string> executecommand(string command) {
list<string> output = new arraylist<>();
try {
processbuilder pb = new processbuilder("/bin/sh", "-c", command);
process process = pb.start();
bufferedreader reader = new bufferedreader(new inputstreamreader(process.getinputstream()));
string line;
while ((line = reader.readline()) != null) {
output.add(line.trim());
}
int exitcode = process.waitfor();
if (exitcode != 0) {
system.err.println("⚠️ 命令执行失败,退出码:" + exitcode);
}
} catch (exception e) {
system.err.println("❌ 执行命令时发生异常:" + e.getmessage());
e.printstacktrace();
}
return output;
}
}javac linuxpackagechecker.javajava linuxpackagechecker🔍 正在检测当前系统并获取已安装软件列表... ✅ 检测到包管理器命令:dpkg -l 📦 已安装软件数量:1852 📋 前 10 个软件包: desired=unknown/install/remove/purge/hold | status=not/inst/conf-files/unpacked/half-conf/half-inst/trig-await/trig-pend |/ err?=(none)/reinst-required (status,err: uppercase=bad) ||/ name version architecture description +++-==============-============-============-================================= ii adduser 3.118ubuntu2 all add and remove users and groups ii apt 2.4.8 amd64 commandline package manager ii base-files 12ubuntu4.4 amd64 debian base system miscellaneous f ...
dpkg -l | sort -k2 rpm -qa | sort
dpkg -l | wc -l # 注意包含标题行 dpkg -l | grep ^ii | wc -l # 仅统计已安装的 rpm -qa | wc -l
dpkg-query -w -f='${package},${version},${architecture}\n' > packages.csv
输出:
vim,2:8.2.3995-1ubuntu2.4,amd64 curl,7.81.0-1ubuntu1.10,amd64
dpkg --get-selections | awk '{print $1}'
rpm -qa --queryformat '%{name}\n'
以下是一个 bash 脚本,用于自动检测系统类型并导出软件列表:
#!/bin/bash
echo "🚀 开始导出已安装软件列表..."
output_file="installed_packages_$(date +%y%m%d_%h%m%s).txt"
if command -v dpkg &> /dev/null; then
echo "📦 检测到 debian/ubuntu 系统"
dpkg -l > "$output_file"
elif command -v rpm &> /dev/null; then
echo "📦 检测到 rhel/centos/fedora 系统"
rpm -qa > "$output_file"
elif command -v pacman &> /dev/null; then
echo "📦 检测到 arch linux 系统"
pacman -q > "$output_file"
elif command -v zypper &> /null; then
echo "📦 检测到 opensuse 系统"
zypper search -i > "$output_file"
else
echo "❌ 未识别系统类型"
exit 1
fi
echo "✅ 已保存至 $output_file"
ls -lh "$output_file"
保存为 export_packages.sh,赋予执行权限:
chmod +x export_packages.sh ./export_packages.sh
✅ 解决方案:使用 grep
dpkg -l | grep -i firefox
-i 表示忽略大小写。
✅ 解决方案:
rpm -qa | sort
✅ 在 dnf 中:
dnf info <package_name>
在 apt 中:
apt show <package_name>
✅ 使用历史记录:
# ubuntu/debian cat /var/log/apt/history.log # centos/fedora cat /var/log/dnf.log
如果你管理多台服务器,可以考虑构建一个集中式的“软件资产清单系统”,基本架构如下:
功能包括:

可用 python + flask + sqlite 快速搭建原型,或集成到现有监控系统(如 zabbix、prometheus + grafana)。
/var/log/)。在 docker 或 podman 容器中,查看已安装软件的方法类似,但需先进入容器:
docker exec -it <container_name> /bin/bash # 然后执行 dpkg -l 或 rpm -qa
或者直接执行:
docker exec <container_name> dpkg -l
对于基于 alpine 的镜像,使用 apk:
docker exec <container_name> apk info
查看 linux 系统中已安装的软件看似简单,实则涉及众多命令、工具和最佳实践。无论是日常维护、故障排查,还是自动化运维、安全加固,掌握这些技能都至关重要。希望本文提供的命令示例、java 代码、脚本模板和架构思路能为你带来实质性的帮助。
记住,linux 的强大在于其灵活性和可组合性——你可以将简单的命令通过管道、脚本、程序组合成强大的自动化工具。不断实践、积累经验,你会越来越得心应手!
bonus tip:在终端中设置别名,让常用命令更高效!
# 添加到 ~/.bashrc 或 ~/.zshrc alias listpkgs='dpkg -l 2>/dev/null || rpm -qa 2>/dev/null || pacman -q 2>/dev/null'
然后只需输入:
listpkgs | head -20
即可快速查看前 20 个包!
以上就是linux查看系统已安装软件的多种方法的详细内容,更多关于linux查看已安装软件的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论