Как узнать, из какого пакета Debian поступил файл?
5 ответов
user@host:~$ dpkg-query -S /bin/bash
bash: /bin/bash
Где bash - это имя пакета.
В 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
Бинго! Это пакет.
Другая альтернатива:
$ dpkg -S /bin/bash
bash: /bin/bash
По крайней мере, на моем Ubuntu оба находятся в пакете dpkg
, так что нет никакого реального преимущества перед любым конкретным ...
Файлы, сгенерированные при установке , не будут найдены 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)"
Не будучи знакомым с 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:~$