我需要找到安装在Debian (Armbian)服务器上的软件包列表。由于它是脱机的,所以我不能使用apt或dpkg (或任何其他命令)。我需要知道which文件(S)包含列表(即使它们是二进制的)。我试着搜索,但一切只是说运行上述命令,这不是一种选择。
发布于 2021-06-15 13:57:13
如何近似dpkg --get-selections来自/etc和/var的备份?解决了您的潜在问题。
已安装软件包的列表存储在/var/lib/dpkg/status中。查找Status: install ok installed行--这表明包已正确安装。
以下AWK调用将从status文件中提取已安装的包名:
awk '/^Package:/ { package = $2 }
     /^Status: install ok installed/ { print package }' /path/to/status如果系统支持多个体系结构,那么您也需要跟踪这一点:
awk '/^Package:/ { p = $2; i = 0 }
     /^Status: install ok installed/ { i = 1 }
     i && /^Architecture: all/ { print p; next }
     i && /^Architecture/ { printf "%s:%s\n", p, $2 }' /path/to/status另一个有趣的文件是/var/lib/apt/extended_states,它记录已安装软件包的“自动安装”标志。您可以通过运行以下代码来还原这些标志
awk '/^Package:/ { p = $2 }
     /^Architecture/ { a = $2 }
     /^Auto-Installed: 1/ { printf "%s:%s\n", p, a }' /path/to/extended_states |
xargs sudo apt-mark auto您可以将这两个文件组合起来列出手动安装的包,并依靠依赖关系管理来安装自动安装的包(尽管这并不一定会导致安装相同的软件包):
awk 'FNR == NR && /^Package:/ { p = $2 }
     /^Status: install ok installed/ { i = 1 }
     FNR == NR && i && /^Architecture: all/ { ps[p] = 1; next }
     FNR == NR && i && /^Architecture/ { ps[p ":" $2] = 1}
     FNR != NR && /^Package:/ { p = $2 }
     FNR != NR && /^Architecture:/ { a = $2 }
     /^Auto-Installed: 1/ { delete ps[p ":" a] }
     END { for (p in ps) print p }' /path/to/status /path/to/extended_states请参阅man dpkg中的“文件”部分:
可用包的/var/lib/dpkg/status状态。此文件包含有关包是否标记为移除、是否已安装等信息。
https://unix.stackexchange.com/questions/654369
复制相似问题