Как обновить один пакет, используя apt-get?


827

Как мне обновить один пакет? Насколько man apt-getсказано apt-get upgrade, не принимает пакет / список пакетов в качестве параметра:

Обновить

Обновление используется для установки новейших версий всех пакетов, установленных в настоящее время в системе из источников, перечисленных в /etc/apt/sources.list. Пакеты, установленные в настоящее время с доступными новыми версиями, извлекаются и обновляются; ни при каких обстоятельствах установленные в настоящее время пакеты не удаляются, а пакеты, которые еще не установлены, извлекаются и устанавливаются. Новые версии установленных в настоящее время пакетов, которые нельзя обновить без изменения состояния установки другого пакета, останутся в их текущей версии. Сначала необходимо выполнить обновление, чтобы apt-get знал, что доступны новые версии пакетов.

Ответы:


1027

Вам просто нужно сделать apt-get install --only-upgrade <packagename>. Это обновит только этот единственный пакет, и только если он установлен.

Если вы хотите установить пакет, если он не существует, или обновить его, если он есть, вы можете пропустить --only-upgrade.


88
apt-get install --only-upgrade <packagename>не будет устанавливать никаких новых пакетов
taneli

9
Будет ли installкоманда обновлять также зависимости этого пакета в случае необходимости?
Пино

7
@Pino Это будет, имеет смысл сделать это. Что если версия, которую вы обновляете, зависит от более новой версии другого пакета? Вы прокляты, если не обновите оба. Вот почему installэто правильная команда, даже если она кажется нелогичной.
Мэтт Додж

6
Это убирает метку "авто"? Иногда, когда вы устанавливаете библиотеки специально, пакет помечается как установленный вручную. По этой причине я не люблю запускать 'install' для библиотек.
Isaaclw

3
Я только что проверил, так как вся информация довольно расплывчата; в Ubuntu 16.04 ( apt 1.0.1) обновление пакета с помощью apt installне влияет на autoметку, независимо от того --only-upgrade, включена она или нет. Хотя, конечно, использование --only-upgradeимеет смысл, если вы не хотите случайно установить что-то новое. Это также обновит все необходимые зависимости.
сдал экзамен

129

Чтобы обновить один пакет, используя CLI:

sudo apt-get install --only-upgrade <packagename>

например, sudo apt-get install --only-upgrade ack

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Skipping **ack**, it is not installed and only upgrades are requested.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

11
Я получаю сообщение об ошибке с этой командой:E: Sense only is not understood, try true or false.
Michael

1
Для тех, кто сталкивается с ошибкой предыдущего комментатора, смотрите мой ответ ниже .
Голем

3
понизили голосование, так как не добавляли новую информацию из предыдущих ответов
gokul_uf

1
Вы должны перейти --only-upgradeк installподкоманде, а не напрямую apt-get, тогда вам не нужно будет добавлять true.
Руслан

55

Есть два возможных способа, которыми я могу придумать:

  1. sudo apt-get install nameofpackage

    Это обновит пакет, даже если он уже установлен:

    ~$ sudo apt-get install emesene
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following packages will be upgraded:
      emesene
    1 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
    Need to get 1,486 kB of archives.
    After this operation, 696 kB disk space will be freed.
    Get:1 http://il.archive.ubuntu.com/ubuntu/ natty-updates/universe emesene all 2.11.4+dfsg-0ubuntu1 [1,486 kB]
    
  2. Использование Synaptic Package Manager: Щелкните правой кнопкой мыши → Отметить для обновления :

    введите описание изображения здесь

    Примечание : иногда он может запрашивать дополнительные пакеты или зависимости, это нормально.


1
Да, он должен и sudo apt-get install whateverдолжен сделать обновление самостоятельно.
Binarylife

4
upgradeне принимает аргумент пакета.
ℝaphink

25

По моему опыту на Ubuntu 12.04 LTS, использование команды ниже не приведет к обновлению пакета, если используется отдельный PPA -

sudo apt-get --only-upgrade install <packagename>

Точно так же я не хотел запускать команду обновления, которая обновляла бы все пакеты на моем сервере -

sudo apt-get dist-upgrade

Например, у меня установлен PHP 5.3 и я добавил PPA-файл ondrej в мои apt.sources, используя -

sudo add-apt-repository ppa:ondrej/php5

Если я бегу

sudo apt-get install php5

это просто переустановит PHP 5.3.

Я должен, во-первых, определить номер версии для обновления, используя

sudo apt-cache policy php5

Это перечислит все доступные номера версий. Вы должны найти номер версии, которую хотите обновить, и скопировать всю строку, которая ссылается на него. Например, строка для PHP 5.5 в Ubuntu имеет вид «5.5.16 + dfsg-1 + deb.sury.org ~ точное + 2».

Теперь вы можете запустить команду apt-get install с указанным номером версии и вуаля!

sudo apt-get install php5=5.5.16+dfsg-1+deb.sury.org~precise+2

Я только добавил это, потому что я не мог найти эту информацию где-либо еще!


16

На Ubuntu 9.04 Jaunty,

apt-get --only-upgrade install <package>

выходы:

E: Sense only is not understood, try true or false.

Команда

apt-get --only-upgrade true install <package>

работал в моем случае.


4
Вы должны перейти --only-upgradeк installподкоманде, а не напрямую apt-get, тогда вам не нужно будет добавлять true.
Руслан

10

Для решения командной строки, которое не устанавливает пакет, если он еще не существует:

dpkg -s <package> 2>/dev/null | grep -q Status.*installed && sudo apt-get install <package>

Это легко сделать из скрипта, например:

upgrade-package.sh:

#!/bin/bash

[[ -z $1 ]] && { echo "Usage: $(basename $0) package"; exit 1; }

if dpkg -s "$1" 2>/dev/null | grep -q Status.*installed; then
    echo "Attempting to upgrade $1"
    sudo apt-get install "$1"
else
    echo "Package $1 is not installed"
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.