user@host:~$ dpkg -l | tail -n +6 | wc -l
1212
user@host:~$ ls /usr/share/doc/ | wc -l
1148

Моя цель - собрать информацию о лицензии для всех установленных пакетов. Использование команды dpkg -l дает мне 1212 записей, но я вижу только 1148 каталогов в /usr/share/doc/ . Что может объяснить это несоответствие?

2 ответа2

1

Для этого есть две общие причины:

  1. Не все пакеты содержат фактические данные. Некоторые из них являются так называемыми «метапакетами», которые состоят исключительно из списка зависимостей (хорошие примеры - основные пакеты для большинства сред рабочего стола). Некоторые из них являются «виртуальными» пакетами, которые существуют, чтобы обеспечить простой способ зависеть от конкретной службы, не заботясь о том, какая реализация используется (например, пакет «init» в Debian). Debian также имеет «переходные фиктивные пакеты», которые существуют для того, чтобы убедиться, что зависимости по-прежнему корректно разрешаются во время обновлений (потому что сам dpkg не имеет возможности переименовывать установленные пакеты).
  2. У вас могут быть некоторые пакеты, которые были удалены, но в системе по-прежнему есть файлы конфигурации. Команда dpkg вы дали, будет по-прежнему перечислять эти пакеты вместе с установленными, но у них почти никогда не будет каталога в /usr/share/doc .
1

Вот один из способов понять это: сравнение.

deltik@node51 [~]$ dpkg -l | tail -n +6 | wc -l
3170
deltik@node51 [~]$ ls /usr/share/doc/ | wc -l
2964

Каждая строка dpkg -l | tail -n +6 отформатирован так:

ii  zram-config                                                 0.5                                                      all          Upstart job to enable zram support

Каждая строка ls /usr/share/doc/ отформатирована так:

zram-config

Чтобы команды соответствовали друг другу, они должны выглядеть так: dpkg -l | tail -n +6 | awk '{print $2}' | sort -h и ls /usr/share/doc/ | sort -h

Теперь поместите результаты в два файла:

deltik@node51 [~]$ dpkg -l | tail -n +6 | awk '{print $2}' | sort -h > /tmp/a.txt
deltik@node51 [~]$ ls /usr/share/doc/ | sort -h > /tmp/b.txt

И измените их (используйте colordiff для более удобного просмотра):

colordiff /tmp/{a,b}.txt

В моей системе я видел эти шаблоны:

  • Если у вас две разные архитектуры, вы увидите, что /usr/share/doc/ показывает только базовый пакет без добавленной архитектуры:

    305,308c305,306
    < gcc-5-base:amd64
    < gcc-5-base:i386
    < gcc-6-base:amd64
    < gcc-6-base:i386
    ---
    > gcc-5-base
    > gcc-6-base
    

    Это составляет большую часть различий в моей системе multiarch (i386 и amd64).

  • Если вы игнорируете различные архитектуры из команды dpkg -l (dpkg -l | tail -n +6 | awk '{print $2}' | awk -F":" '{print $1}' | sort -h | uniq > /tmp/a.txt), вы увидите, что некоторые пакеты ничего не помещают в /usr/share/doc/ , например, пакеты, начинающиеся с linux-image .

  • Или в /usr/share/doc/ есть другое имя папки, например NetworkManager для пакета network-manager или HTML для различных пакетов KDE.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .