파일을 제공하는 패키지는 어떻게 찾습니까?


467

간단한 질문 : 시스템의 파일 경로가 주어지면 사용할 수있는 쉘 명령 (또는 GUI 방법)이 있습니까? 어떤 패키지에 넣었는지 알려줍니다. 파일이 실제로 패키지에서 나온 것으로 가정합니다.

보너스 질문 : 시스템에 설치되지 않은 파일 인 경우 어떻게합니까? 예를 들어, 파일을 찾아서 어떤 패키지가 제공하는지 확인할 수있는 웹 사이트가 있습니까?


6
나는 항상 이것을 스스로 궁금해했다. 나는 YUM과 함께 <filepath> / <filename>을 제공하는 yum을 할 수 있지만 패키지 웹 사이트 이외의 Aptitude에서 그 대안을 찾지 못했다
Marco Ceppi


여기서 답변 중 실제로 Provides:메커니즘을 다루지는 않습니다 . 보다 상세하게는, 어떤 패키지 에서나 바이너리 와 같은 mailx또는 명령어 sendmail는 포함되지 않는다 ; 대신, 다양한 패키지가 자체 바이너리를 설치 한 다음 일부 패키지를 통해 "정식"이름으로 사용할 수 있도록합니다 . 참조 askubuntu.com/questions/366135/.../etc/alternatives
tripleee

답변:


438

dpkg명령을 사용 하여 파일을 소유 한 설치된 패키지를 찾을 수 있습니다 .

보낸 사람 man dpkg:

-S, --search 파일 이름 -search-pattern ...
                  설치된 패키지에서 파일 이름을 검색하십시오.

예:

$ dpkg -S /bin/ls
coreutils: /bin/ls

전체 경로 또는 파일 이름 만 사용하여 검색 할 수 있습니다.

컴퓨터에 아직 설치되지 않은 파일을 검색하려면 Ubuntu 패키지 검색을 사용할 수 있습니다


5
빠른 검색을 위해 매일 업데이트되는 dlocate를 사용하는 것이 좋습니다.
다니엘 T 첸

20
힌트 : 전체 경로를 모르지만 명령 이름 만 whichdpkg -S `which firefox`
알면

1
@DanielTChen, dlocatedlocate의 데이터베이스가 오래된 경우에는 작업을 수행 할 수 없습니다. sudo update-dlocatedb업데이트 하려면 전화 해야합니다.
jarno

2
경우 dpkg정확한 경로 아무것도 (예를 반환하지 않습니다 dpkg /usr/bin/java) 그냥 실행 파일의 이름 (예를보십시오 dpkg java).
Dan Dascalescu

2
다음 realpath과 같이 심볼릭 링크를 해결 하는 데 사용할 수도 있습니다 dpkg -S $(realpath $(which <command>)).
Lars Nyström

236

apt-file명령은 명령 줄에서 당신을 위해이 작업을 수행 할 수 있습니다. 소스에서 패키지를 빌드 할 때 자주 사용합니다. 시스템에 이미 설치된 패키지에서 제공 한 파일의 경우 apt-cache다른 선택입니다.

설치하려면 다음 apt-file을 수행하십시오.

sudo apt-get install apt-file

그런 다음 데이터베이스를 업데이트해야합니다.

apt-file update

마지막으로 파일을 검색하십시오.

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

그러나 훨씬 친숙한 방법은 Ubuntu 패키지 검색 웹 사이트 를 사용하는 것 입니다. 특정 파일 이름에 대한 "패키지 내용 검색"옵션이 있습니다.


21
제 생각에는 이것이 받아 들여지는 대답이어야합니다. 그러나 Ubuntu Packages Search 에 응답 하여이 간단한 쉘 프로그램은 매우 친숙하고 기억하기 쉽다고 주장 할 수 있습니다 (한 번 알면). dpkg, apt-get 또는 aptitude를 표준 도구로 사용하는 경우 인터넷을 서핑하기 위해 Chrome을 실행하는 것에 친숙하지 않습니다!
user2097818

3
@ user2097818 이것이 허용되지 않는 이유는 기본 질문이 시스템의 파일과 설치된 패키지로 제한되어 있기 때문입니다. apt-file종종 설치되지 않은 패키지, 즉 오 탐지를 찾습니다. 물론이 답변은 "보너스 질문"에 좋습니다.
David Z

3
세계의 Redhat 측 사람들에게는 – apt-file search <>가장 가까운 아날로그가 dnf/yum whatprovides <>있습니다.
ffledgling

나는 별명 apt-file find으로 apt-find오래 전에 그것은 정말 편리합니다! Btw, 최신 버전에는에 대한 루트가 필요합니다 apt-file update.
val

43

설치되지 않은 패키지에서 파일을 찾기위한 apt 파일도 있습니다. 예를 들면 다음과 같습니다.

apt-file list packagename


13

어떤 응용 프로그램이 아닌 어떤 패키지를 의미합니다. 응용 프로그램은 패키지 관리자입니다 (예 :) Software Center.

사용 dpkg:

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

사용 apt-file:

apt-file search /usr/lib/tracker/tracker-store

또는 가능하다 :

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

또는 온라인 여기 , 섹션 Search the contents of packages.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


어떤 응용 프로그램이 아닌 어떤 패키지를 의미합니다. 응용 프로그램은 패키지 관리자입니다 (예 : Software Center). 괜찮아. 감사합니다! :)
ReyKev

모든 도움을 주셔서 감사합니다! 이 제안들 중 어느 것도이 응용 프로그램을 설치 한 패키지를 찾는 데 도움이되지 않았습니다. 모든 검색은 "트래커"로 돌아갑니다. 그래도 Enthoughts 'Canopy 인 것 같았습니다. 1 마일의 EULA는 저의 오래된 Microsoft Windows 멍청함을 상기시켜주었습니다. 어제 Tracker가 설치되어 루트로 Enthoughts 'Canopy와 함께 제거했으며 모든 문제가 해결되었습니다. 모든 도움에 진심으로 감사드립니다. 그러한 지원을받는 것은 정말 대단한 일입니다. 다시 감사합니다! 케빈
ReyKev

4

이것은 Alexx Roche의 탁월한 답변에 대한 확장 입니다. 그 답변을 편집하려고했지만 거부되었습니다 (Alexx는 아니지만)


which시스템에 설치된 것을 추적하려고했습니다 . 약간의 작업을 한 후/usr/local/bin/apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

설치된 대부분의 것들에 대해서는 다음을 사용할 수 있습니다.

apt-file search $(realpath $(which THING)) | grep 'THING$'

설치되지 않은 것의 경우 다음을 사용할 수 있습니다.

apt-file search THING | grep '/THING$'

apt-whatprovides스크립트는 시스템에 있거나없는 파일에 대해 작동합니다. 예를 들어, 내 시스템은 부족 dig했지만 ping결과는 다음과 같습니다.

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides dig
Searching for dig
dnsutils: /usr/bin/dig
epic4: /usr/share/epic4/script/dig
epic4-help: /usr/share/epic4/help/8_Scripts/dig
knot-dnsutils: /usr/bin/dig

그주의 Searching for에 대한 완전한 경로 ping에 대한 (설치) 단지 바이너리 이름 dig설치되어 있지 않습니다. 이것은 내가 검색 dnsutils하지 않아도 설치 가 필요 하다는 것을 발견하는 데 도움이되었습니다 https://packages.ubuntu.com/#search_contents


이것은 내 대답을 삭제 해야하는 좋은 대답입니다!
Alexx Roche

3

which시스템에 설치된 것을 추적하려고했습니다 . 약간의 작업을 한 후 나는 apt-whatprovides를 만들었습니다.

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

대부분의 것들에 대해서만 사용할 수 있지만

apt-file search $(realpath $(which THING))|grep 'THING$'

1
Alexx, 나는이 답변을 좋아한다. 편집 내용이 마음에 들지 않기를 바랍니다. 시스템에 설치되지 않은 파일에서도 작동하도록 만들었습니다. gist.github.com/RichardBronosky/… 에서 백업을 만들었 으며 되돌 리거나 거부하면 나만의 답변을 만들 것입니다.
Bruno Bronosky

업데이트 :이 답변에 파스타를 복사하고 미묘하게 변경하는 것이 좋지만 편집이 거부되었습니다. 나는 당신이 대답의 완전성을 유지 한 것처럼 느끼길 바랍니다 .
Bruno Bronosky

자유롭게 편집하거나 해킹하십시오. 당신을 위해 더 나은 모든 것, (그래서 내가 MIT 라이센스를 추가 한 이유입니다! 신용이 필요하지 않습니다.)
Alexx Roche

2

이 작업을 수행해야하는 한 가지 이유는 이미 우분투 패키지가있는 소프트웨어를 컴파일하는 경우 실행할 수 있기 때문입니다 apt-get build-dep $PACKAGENAME. 컴파일해야 할 모든 패키지가 설치됩니다 $PACKAGENAME.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.