如何在存储库中找到包的最新版本?

如何在存储库中找到包的最新版本?

如何在 shell 脚本中查找存储库中软件包的最新版本?如果我使用apt-cache-policy,我会将安装的版本作为“候选”,而不是存储库中的最新版本。

apt-cache policy nvidia-current显示:

nvidia-current:
  Installed: 280.13-0ppa~natty1
  Candidate: 280.13-0ppa~natty1
  Version table:
 *** 280.13-0ppa~natty1 0
        100 /var/lib/dpkg/status
     270.41.06-0ubuntu1 0
        500 http://archive.ubuntu.com/ubuntu/ natty/restricted amd64 Packages

似乎已安装的版本标有***,因此必须忽略该版本。也许有一个可以使用的 awk 脚本?

答案1

我建议使用以下 awk 脚本,将 apt-cache 策略输出提供给该脚本:

#!/usr/bin/awk -f

/^     [^ ]/ {
  version = $1
}
/^ \*\*\* [^ ]/ {
  version = $2
}
/^        [^ ]/ {
  server = $2
  if (server !~ /^\//) {
    print version
    exit
  }
}

答案2

以下命令似乎有效:

LANG=C apt-cache policy nvidia-current | grep '^     [^ ]' |\
    sort | awk '{print $1}' | head -1

LANG=C确保输出在不同语言环境中保持一致。grep匹配一组空格后跟一个非空格字符(例如版本)。awk显示第一个非空白块的版本。接下来,对输出进行排序,最新版本应该位于顶部,由 占用head

答案3

你可能想看看rmadison

#! /bin/bash

DEFAULT_DIST="$(ubuntu-distro-info --stable)"
PACKAGE="$1"
TARGET_DIST="$2"
ARCH="$(dpkg --print-architecture)"

if [ -z "$1" ]; then
  echo "Usage: $0 <PACKAGE> <DIST>"
  exit
fi

if [ -z "$TARGET_DIST" ]; then
  TARGET_DIST=$DEFAULT_DIST
  echo "Target dist not specified. Assuming $DEFAULT_DIST."
fi

VERSION="$(rmadison $PACKAGE -a $ARCH | grep $TARGET_DIST | cut -d "|" -f 2)"

echo $VERSION

或者单行:

rmadison nvidia-current -a amd64 | grep natty | cut -d "|" -f 2

相关内容