Как вывести список файлов пакета Debian без установки


284

Эта команда может только перечислить содержимое установленных пакетов,

dpkg -L PACKAGENAME

но как составить список содержимого неустановленного пакета, чтобы просмотреть / просмотреть пакет?


Ответы:


340

dpkg -c(или --contents) перечисляет содержимое файла пакета .deb (это интерфейс для dpkg-deb.)

dpkg -c package_file.deb

Для работы напрямую с именами пакетов, а не с файлами пакетов, вы можете использовать apt-file. (Вам может понадобиться apt-fileсначала установить пакет.)

sudo apt-file update        
apt-file list package_name

Как указано в первом комментарии, apt-файл перечисляет содержимое пакетов в ваших уже настроенных репозиториях Apt. Не имеет значения, установлен ли какой-либо конкретный пакет или нет.


17
apt-file также должен быть обновлен ( sudo apt-file update) и отображает только содержимое пакетов в ваших уже настроенных репозиториях Apt.
шарлатан Quixote

1
@quackquixote: В Ubuntu 12.04 это происходит автоматически
confiq

1
dpkg -cотлично!
d -_- б

2
Ответ Apt-файла предполагает, что ваш пакет приходит из настроенного хранилища, а не из .debфайла, который вы скачали отдельно. Хотя первоначальный вопрос неоднозначен.
Зоредаче

5
@confiq, не моим тестированием. Я использую 12.04.4, и он по-прежнему говорит: «E: Кэш пуст. Сначала нужно запустить« apt-file update »».
Мэтью Флэшен

58

Используйте --contentsвместо -L:

dpkg --contents PACKAGENAME

При использовании таким образом dpkgдействует как интерфейс dpkg-deb, так что используйте, man dpkg-debчтобы увидеть все варианты.

Вы также можете использовать архив браузера для просмотра содержимого пакета.


2
Это не работает, если я сначала не установил его, а затем удалил.
Xiè Jìléi

3
он должен работать нормально, если вы дадите ему файл .deb в качестве аргумента (вместо PACKAGENAME укажите его PACKAGE-DEB-FILE).
шарлатан-кихот

3
Этот ответ неверен. Вы должны сначала установить пакет. Если он не установлен, значит, у вас нет файла .deb.
Нейл

Эта команда работает для меня. Например, я скачал google-chrome-stable_current_amd64.deb из Google. Затем dpkg --contents google-chrome-stable_current_amd64.debвыполнил команду: и он перечислил все файлы, которые он установит (в основном, в /opt/google/chrome), ни один из которых в настоящее время не установлен в моей системе, когда я набираю это. (Я использую Xubuntu 11.10, если это имеет значение.)
quux00

10
@ Нейл, ответ не неправильный. То, что у вас есть файл deb, не означает, что он установлен. apt-file нужен весь пакет, необходимый для сборки. OO
d -_- b

21

dpkg --contentsпозволит вам посмотреть на удаленный пакет. Если .deb еще не в вашей системе, сделайте

apt-get --download-only install pkgname

Пакет будет загружен, /var/cache/apt/archivesно не установлен.


3
Могу ли я просто перечислить содержимое без загрузки? Если у меня очень медленное соединение, и если пакет слишком велик для загрузки. Если у файла .deb есть заголовок файла, куда идет список содержимого, я думаю, что загрузка всего пакета может быть не нужна. Это возможно?
Xiè Jìléi

13

Лучшим способом было бы просмотреть непосредственно хранилище пакетов:

http://packages.debian.org/[distro name]/all/[package name]/filelist

Пример:

http://packages.debian.org/wheezy/all/transmission-common/filelist


И чтобы не покидать терминал, вы можете использовать, например, lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(при условии, что вы lynxустановили).
Руслан

8

Я взял http-идею @ baldoz и обобщил ее для Ubuntu и Debian, немного добавил sedи обернул в одну строку функции bash:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu https://packages.ubuntu.com ' -e 's Debian https://packages.debian.org ')/$(lsb_release -sc)/all/$1/filelist | sed -n -e '/<pre>/,/<\/pre>/p' | sed -e 's/<[^>]\+>//g' -e '/^$/d'; }

Использование:

$ deb_list curl
/usr/bin/curl
/usr/share/doc/curl/changelog.Debian.gz
/usr/share/doc/curl/copyright
/usr/share/doc/curl/NEWS.Debian.gz
/usr/share/man/man1/curl.1.gz

Та же функция на нескольких строках:

function deb_list () {
    curl -s $(lsb_release -si \
                | sed -e 's Ubuntu https://packages.ubuntu.com ' \
                      -e 's Debian https://packages.debian.org '
              )/$(lsb_release -sc)/all/$1/filelist \
      | sed -n -e '/<pre>/,/<\/pre>/p' \
      | sed -e 's/<[^>]\+>//g' -e '/^$/d';
}

Разъяснение:

  1. lsb_release -si возвращает "Ubuntu" или "Debian", замените его на базовый URL https://packages.ubuntu.comилиhttps://packages.debian.org
  2. lsb_Release -sc возвращает кодовое имя (например, «trusty», «sid» и т. д.), которое используется для создания полного URL: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Получите этот URL с помощью curl и передайте HTML через три команды sed. Сначала захватывает только список файлов (что между ними <pre>и </pre>теги); второй удаляет любые HTML-теги; третий удаляет все пустые строки.

Примечание: он не ищет PPA, альтернативные репозитории apt-источников и запрашивает только официальные пакеты, доступные для выпуска Debian / Ubuntu, которую вы используете.


Мне нужен рубин, чтобы запустить его?
Анвар

1
@ Анвар, я изначально использовал Ruby, потому что я был ленив, а многострочные регулярные выражения засасывали sed / awk / grep. Но я переписал его для использования двух команд sed, Ruby не требуется.
Notpeter

Приятно! Это ответ, который я искал
Анвар

4

Для всех тех людей, которые могут по-прежнему гуглить эту проблему в январе 2017 года, вы можете иметь некоторые интересные вещи с последними версиями apt и dpkg в Debian 8.5, не загружая ничего.

Список содержимого файла Deb без загрузки:

Сначала найдите полный URL-адрес файла deb:

root@debian:apt-get --print-uris download yade
'http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb' yade_2016.06a-7_amd64.deb 1621148 SHA256:26c0d84484a92ae9c2828edaa63243eb764378d79191149970926aa3ec40cdd4

PS: переключатель --print-uris печатает URL пакета deb, но deb не загружается.

Затем отобразите содержимое пакета deb, не загружая его:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb -c /dev/stdin
drwxr-xr-x root/root         0 2016-12-10 22:18 ./
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/bin/
-rwxr-xr-x root/root     13184 2016-12-10 22:18 ./usr/bin/yade
.........................more files listed bellow ......................

PS: тот же результат может быть достигнут с

root@debian:dpkg -c <(curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb")

Извлеките файл из вышеуказанного пакета deb, без загрузки.
Например, мы хотим прочитать справочную страницу пакета yade, не устанавливая этот пакет и даже не загружая пакет deb.

Имя файла справочной страницы внутри пакета deb в соответствии с рекомендациями dpkg -cis./usr/share/man/man1/yade.1.gz

Чтобы прочитать справочную страницу на лету:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb --fsys-tarfile /dev/stdin |tar -xO ./usr/share/man/man1/yade.1.gz |man /dev/stdin

Страница man отображается правильно с помощью приложения man.

PS: Над трубами не работает команда ar.

root@debian:apt --version --> apt 1.4~beta2 (amd64)
root@debian:dpkg --version --> Debian 'dpkg' package management program version 1.18.18 (amd64).
root@debian:man --version --> man 2.7.6.1
root@debian:tar --version --> tar (GNU tar) 1.29

Это описание работает для систем, которые используют только «apt» и не имеют более старых доступных команд «apt-x»!
Джон Уотт


1

Кажется, это невозможно до первой установки или извлечения списка из .debфайла.

Попробуйте следующую команду:

dpkg --contents <(curl -s $(apt-get install --yes --no-download --reinstall --print-uris language-pack-en | tail -n1 | grep -o "http[^']\+"))

Измените language-pack-enс вашим именем пакета.

Он в основном читает .debизвлеченный файл curlи запускается dpkg --contents FILEна нем.


Вы также можете проверить содержимое, не загружая файл пакета.

Поэтому, если вы знаете URL .debфайла, следующая команда оболочки выведет список всех файлов пакета:

dpkg -c <(curl -sL "http://httpredir.debian.org/debian/pool/main/a/avis/avis_1.2.2-4_all.deb")

Параметры скручивания: -s- молчать, -L- переходить по перемещенным ссылкам.

Если вы не знаете URL, получите по:, apt --print-urisнапример

apt --print-uris install avis | grep avis
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.