Answers:
对于现代版本,apt
有一个特定的开关:
apt list --upgradable
对于旧apt-get
命令,-u
开关显示可升级的软件包列表:
# apt-get -u upgrade --assume-no
-u
--show-upgradeed 显示升级的软件包;打印出所有要升级的软件包的列表。配置项:APT :: Get :: Show-Upgradeed。
--assume-no 对所有提示自动“否”。<==为了防止它开始安装
-u
是apt-get
apt-get --just-print upgrade
不太容易阅读,下面是解析apt-get输出的perl一个内衬:
apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'
这应该输出类似:
PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9
希望它会帮助别人,
column
:apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
你可以跑
aptitude -F%p --disable-columns search ~U
或无证件
/usr/lib/update-notifier/apt-check -p; echo
使用apt-get
模拟的另一种方法:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
但不丢失一些需要使用的软件包aptitude
。 aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
做到了!
看一看“ apticron”软件包:
apticron-用于邮寄有关待处理软件包更新的简单工具
Apticron是一个简单的脚本,它每天发送有关待处理的软件包更新(例如安全更新)的电子邮件,并通过dselect和aptitude正确处理保留的软件包。
apt-get update && apt-get -s upgrade
将列出可用更新,而无需实际安装。
在完成模拟(因此-s)升级之前,第一个命令将更新软件包索引文件。“ -s”将进行模拟升级,显示将安装但实际上不会安装任何包的数据包。
相反,在确认后实际上将安装“ -u”而不是“ -s”。
-s, --simulate, --just-print, --dry-run, --recon, --no-act
,侦查和空运行中的任何一个来触发我的个人收藏夹,该模拟选项。
受此答案启发,喷射另一架飞机:
function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;
输出看起来像这样(彩色):
locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users
如果您不希望简短说明,请使用以下内容:
{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;
输出:
locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)
在对@jasonwryan的答案写警告之后,我想提供自己的解决方案:
apt-get dist-upgrade --assume-no
不幸的是,这与debian wheezy不兼容,我不得不检查一些仍未升级的lxc容器。此表格将始终有效:
apt-get dist-upgrade </dev/null
最后,我还想重新格式化输出。我选择再次更改呼叫(使用--dry-run
但忽略所有其他输出),因为它感觉更安全:
apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^ / && p{print $0}
'
返回值:
The following packages have been kept back:
iproute
The following packages will be upgraded:
unzip
作为变体,我使用以下内容:
apt-get -V -s dist-upgrade \
|grep -E "^ .*=>.*" \
|awk 'BEGIN {
ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
}
{
printf "%-30s %-30s %-30s\n",
$1,
substr($2,2),
substr($4,1,length($4)-1)
}'
将其粘贴到一个名为的脚本中apt-updates
,然后您可以调用apt-updates
以获取所有更新的列表,而不管用户如何。
您仍然需要以apt-get update
特权访问权限进行呼叫。
有apt-show-versions
工具。要显示可用更新,请运行:
apt-show-versions -u