我读过的所有答案都建议列出/保存包选择州。即dpkg --get-selections
但选择状态可能不同于实际的。那么为什么要用它呢?难道只是因为获取实际的包裹状态更加复杂吗?
例如获取“已安装的包”,有两种可能的解决方案:
获取包的名称选择状态是安装和
dpkg --get-selections | grep install | cut -f1
获取以下包的名称状态是已安装和
dpkg -l | tail -n +6 | grep '^.i' | cut -d' ' -f3
不同于其他,dpkg --get-selections
dpkg -l
它用于查看,而不是处理。这是为什么呢?
答案1
dpkg --get-selections
仅输出封装选择状态,而不是封装状态。输出dpkg -l
包含封装实际状态,但是dpkg -l
由于更接近图形方法,因此处理输出有点困难。
因此如果您想提取包状态,您可以使用dpkg-query
工具。
它提供使用格式化选项-f, --showformat=format
-f, --showformat=format
This option is used to specify the format of the output --show
will produce. The format is a string that will be output for
each package listed.
因此我将${binary:Package}
字段与${Status}
获取包裹的实际状态结合起来。
dpkg-query --show -f='${binary:Package} \t\t ${Status}\n'
为了获得更格式化的输出,您可以使用
dpkg-query --show -f='${binary:Package} ${Status}\n' | awk '{ printf "%-60s %s\n", $1, $2" "$3" "$4}'
例子
使用dpkg -l
$dpkg -l vlc
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
+++-==============================-====================-====================-=================================================================
hU vlc 2.2.0~pre2-4build1 amd64 multimedia player and streamer
使用dpkg-query --show
$ dpkg-query --show -f='${binary:Package} ${Status}\n' vlc | awk '{ printf "%-60s %s\n", $1, $2" "$3" "$4}'
vlc hold ok unpacked