87

Как узнать, из какого пакета Debian поступил файл?

5 ответов5

102
user@host:~$ dpkg-query -S /bin/bash 
bash: /bin/bash

Где bash - это имя пакета.

40

В Debian есть несколько утилит, которые выполняют эту задачу; проверьте эту страницу для описания. Я упомяну два из них, apt-file и dlocate .

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

dlocate - быстрая альтернатива dpkg -L (команда, которая выводит содержимое пакета), и поэтому она ищет только установленные пакеты. Поиск осуществляется по dlocate -S file.name .

Также вы можете искать пакеты онлайн с помощью сервера packages.debian.org (раздел Поиск содержимого пакетов ).


Установка и использование apt-file

Это хорошая идея для обновления в первую очередь:

sudo apt-get update

Посмотрите, для чего предназначен apt-file :

apt-cache show apt-file

Установите это:

sudo apt-get install apt-file

Чтение данных из репозиториев (это работает также без sudo но создает кеш пользователя; с sudo кеш распространяется на всю систему):

sudo apt-file update

Выполните поиск. В этом примере мы хотим знать, в каком пакете находится исполняемый файл xrandr :

apt-file search xrandr

В нем перечислены многие пакеты с unxrandr , lxrandr.mo или source_lxrandr.py . Не очень полезно в нашем случае. Более умный поиск:

apt-file search -x /xrandr$

($ обозначает конец строки). Пример вывода:

bash-completion: /usr/share/bash-completion/completions/xrandr
x11-xserver-utils: /usr/bin/xrandr

Первый результат не выглядит как исполняемый, второй - Мы можем расследовать дальше. Бежать:

apt-cache show x11-xserver-utils

Бинго! Это пакет.

37

Другая альтернатива:

$ dpkg -S /bin/bash
bash: /bin/bash

По крайней мере, на моем Ubuntu оба находятся в пакете dpkg , так что нет никакого реального преимущества перед любым конкретным ...

10

Файлы, сгенерированные при установке , не будут найдены dpkg -S , как указано по адресу: https://askubuntu.com/a/667227/52975

Например, /bin/nc появляется при установке пакета netcat-openbsd .

Но по факту:

dpkg -S /bin/nc

мы получаем dpkg-query: no path found matching pattern /bin/nc .

Это происходит потому, что /bin/nc генерируется вызовом update-alternatives в сценарии postinst, который запускается после установки.

Это работает так, потому что другая версия /bin/nc предоставляется традиционным пакетом netcat-traditional .

Я не думаю, что есть общий способ поиска таких сгенерированных файлов. В конкретном случае альтернативных символических ссылок мы можем просто перейти по ссылке с помощью readlink -f:

dpkg -S "$(readlink -f /bin/nc)"
2

Не будучи знакомым с Debian, я был озадачен, когда попробовал это:

kearnsp@xubuntuvb:~$ dpkg -S /usr/bin/vncviewer
dpkg-query: no path found matching pattern /usr/bin/vncviewer
kearnsp@xubuntuvb:~$ 

Немного расследования и я нашел посылку:

kearnsp@xubuntuvb:~$ ls -l /usr/bin/vncviewer
lrwxrwxrwx 1 root root 27 May 28 15:49 /usr/bin/vncviewer -> /etc/alternatives/vncviewer
kearnsp@xubuntuvb:~$ ls -l /etc/alternatives/vncviewer
lrwxrwxrwx 1 root root 20 May 28 15:49 /etc/alternatives/vncviewer -> /usr/bin/xvnc4viewer
kearnsp@xubuntuvb:~$ dpkg -S /usr/bin/xvnc4viewer
xvnc4viewer: /usr/bin/xvnc4viewer
kearnsp@xubuntuvb:~$ 

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