Найти пакет, к которому принадлежит файл в Ubuntu / Debian?

300

Я часто скучаю по программе, справочной странице или другому файлу при работе в моей системе Ubuntu 8.04. Есть ли простой способ узнать, какой пакет содержит данный файл (установлен ли он уже или нет)? Может быть, какой-то непонятный вариант для apt или dpkg?

Джей Конрод
источник
То же самое в Ubuntu: askubuntu.com/questions/481/…
Сиро Сантилли 新疆 改造 中 at 法轮功 六四 事件
25
dpkg -S /path/to/fileесли у вас установлен пакет.
Заз

Ответы:

247
apt-file search filename

или же

apt-file search /path/to/file


Для установки apt-fileиспользуйте:

sudo apt-get install apt-file

Вам нужно будет обновить его базу данных, прежде чем вы сможете ее использовать:

sudo apt-file update
Джон Т
источник
7
К вашему сведению: файл apt зависит от Contents-amd64.gz, предоставленного репозиториями. И не все сторонние репозитории предоставляют этот файл.
Шутник
3
Это не сработало для меня. Я обновил базу данных, но она ничего не возвращает. dpkg -Sработает как описано ниже.
Northys
404

(Debian / Ubuntu) Узнайте, к какому пакету принадлежит файл :

dpkg -S /usr/bin/ls

'dpkg -S' просто совпадает со строкой, которую вы предоставляете, поэтому просто использование 'ls' в качестве аргумента соответствует любому файлу из любого пакета, который имеет 'ls' в любом месте имени файла. Поэтому обычно хорошей идеей является использование абсолютного пути. Во втором примере вы можете видеть, что 12 тысяч файлов, которые известны как dpkg, соответствуют пустой строке 'ls'.

splattne
источник
33
Это только если файлы уже установлены
John T
19
В отличие от apt-fileэтого, он также находит пакет в файл, если он был установлен вручную через dpkg -i!
Танус
4
Если вы получаете DPKG-запрос: путь не найден соответствующий шаблон попробовать это : dpkg -S "$(readlink -fn "$(which rename)")".
Пабло А
1
Странно, у меня это не сработало: dpkg-query: no path found matching pattern /usr/bin/javaхотя есть файл на/usr/bin/java
nnyby
@nnyby См. комментарий Пабло А
vog
19

packages.debian.org - это то, что я всегда использую для выполнения этой задачи. Он превосходит apt-файл, потому что он также может найти части имен файлов. Он также связан с основным списком пакетов, в котором будут перечислены описания, ошибки и т. Д. В целом хороший сайт. Не так полезно из командной строки, но все же довольно полезно.

Для скорости я пометил URL:

http://packages.debian.org/search?searchon=contents&keywords=%s&mode=filename&suite=unstable&arch=any

в Firefox и добавил «debfind» в качестве ключевого слова (нажмите «еще» в менеджере закладок, когда он выделен), так что я могу просто набрать «debfind», и он будет работать. Вы можете изменить 'suite' его с нестабильного на стабильный или тестировать, если хотите, для других версий дистрибутива.

jamuraa
источник
Это не работает с пользовательскими репозиториями, хотя.
Ctrl-C
Плохой выбор в отношении автоматизации.
Александр Щебликин
11

Вы также можете использовать dlocate. Со страницы руководства;

$ dlocate [ PATTERN ]
List all records where either the package name or the filename matches PATTERN.
Иеремия
источник
1
dlocateэто также мой любимый метод, очень надежный.
Avio
2
@Avio dlocateне находит недавно установленный пакет, пока вы не запустите его sudo update-dlocatedbсначала. Команда автоматически запускается ежедневно в /etc/cron.daily/dlocate
jarno
4

Я нашел Ваджиг ...

wajig whichpackage /path/to/file 

например.

wajig whichpackage /etc/apt/sources.list

Wajig - это удобный инструмент для командной строки или консоли, который включает в себя все достоинства apt-get, dpkg, которые вы никогда не хотели изучать. ,

Для установки Wajig используйте:

apt-get install wajig

Эта команда 'whichpackage' сама зависит от apt-файла

вам все еще нужно обновить базу данных, прежде чем вы сможете ее использовать: - Я пока не знаю, обновляет ли wajig обновление, которое apt-get также обновляет файловый кеш, но я ожидаю, что это возможно.

sudo wajig update

sudo apt-file update

(и Супер Корова, Пасха egss?!)

pete_m
источник
2

Послушайте ответ Джамуры на Debian, вы также можете перейти на http://packages.ubuntu.com/ для Ubuntu. Вам придется прокрутить немного вниз, чтобы найти окно поиска «Поиск содержимого пакетов», в котором вы можете ввести путь к файлу.

харакири
источник
Теперь, если бы только у Распбиана был такой :)
XTL
0

Попробуйте поискать файлы, используя http://www.kodkast.com/applications/find-which-package-file-belongs-to

Это приложение для поиска файлов, которые содержатся в разных пакетах rpms / linux, и очень полезно, когда на вашей машине даже не установлен rpm.

Рави Агарвал
источник
Downvote: ссылка не работает, и ссылка, по-видимому, предназначена для RPM-пакетов.
tripleee
0

Пакет command-not-found дает вам подсказки о потенциальных командах и имени пакета debian. Он работает, набирая команду в оболочке bash и просматривая ее вывод.

Например, если имя команды известно:

zer@ivy:~ 10:45 $ zsh5
The program 'zsh5' is currently not installed.  To run 'zsh5' please ask
your administrator to install the package 'zsh'
zsh5: command not found

и если команда не известна, применяются некоторые предположения:

zer@ivy:~ 09:46 $ zsh
No command 'zsh' found, did you mean:
 Command 'lsh' from package 'lsh-client' (main)
 Command 'osh' from package 'omake' (main)
 Command 'ysh' from package 'libyaml-shell-perl' (main)
 Command 'ssh' from package 'openssh-client' (main)
 Command 'vsh' from package 'crystalspace' (main)
 Command 'dsh' from package 'dsh' (main)
 Command 'ash' from package 'ash' (main)
 Command 'msh' from package 'nmh' (main)
 Command 'zssh' from package 'zssh' (main)
 Command 'qsh' from package 'gridengine-client' (main)
 Command 'sh' from package 'dash' (main)
 Command 'bsh' from package 'bsh' (main)
zsh: command not found
erwing
источник
Это не работает для произвольных файлов, как, например, запрошенный OP.
CVn
Это проблемный совет, если программа делает вредные вещи и установлена. Добавление -hили --helpв конце поможет немного. Если добавление -hв конце сделало бы это достаточно безопасным, я бы порекомендовал, но даже в этом случае это не хороший способ достичь того, что просит OP.
Доктор Беко