명시 적으로 설치된 패키지 목록


53

젠투에는 /var/lib/portage/world내가 명시 적으로 설치 한 패키지가 들어 있는 파일 이 있습니다. 명시 적으로 나는 기본적으로 설치되거나 종속성에 의해 끌어 들여진 것을 포함하여 내가 선택한 패키지를 의미합니다.

우분투에서 해당 정보를 찾는 비슷한 파일이나 명령이 있습니까?

답변:


46

코드 만

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

설명

이 문제를 생각하는 한 가지 방법은 이것을 세 부분으로 나누는 것입니다.

  • 종속성으로 설치되지 않은 패키지 목록을 얻으려면 어떻게합니까?
  • 기본적으로 설치된 패키지 목록을 얻으려면 어떻게합니까?
  • 이 두 목록의 차이점을 어떻게 알 수 있습니까?

종속성으로 설치되지 않은 패키지 목록을 얻으려면 어떻게합니까?

다음 명령이 내 시스템에서 작동하는 것 같습니다.

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Gilles가 질문에 대한 의견으로 게시 한 링크에서 유사한 접근 방식을 찾을 수 있습니다. 일부 소식통은 적성을 사용하여 패키지를 설치 한 경우에만 작동한다고 주장합니다. 그러나 나는 적성을 사용하여 패키지를 설치하지 않았으며 이것이 여전히 효과가 있음을 발견했습니다. 이는 --disable-columns패키지 이름의 행이 공백으로 채워져 아래 비교를 방해하지 않도록합니다. | sort -u종류의 파일은 중복을 제거합니다. 이렇게하면 최종 단계가 훨씬 쉬워집니다.

기본적으로 설치된 패키지 목록을 얻으려면 어떻게합니까?

참고 : 이 섹션은 내가 설명하는 '잘못된 경로'로 시작합니다. 두 번째 코드는 작동하는 코드입니다.

조금 까다 롭습니다. 필자는 처음에는 메타 패키지 우분투-최소, 우분투 표준, 우분투-데스크톱 및 다양한 리눅스 커널 관련 패키지의 종속성 인 모든 패키지가 좋은 근사치라고 생각했습니다. 구글 검색에 대한 몇 가지 결과는이 접근법을 사용하는 것처럼 보였다. 이러한 종속성 목록을 얻으려면 먼저 다음을 시도했습니다 (작동하지 않음).

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

이것은 기본적으로 온 패키지를 생략 한 것으로 보입니다. 메타 패키지의 올바른 목록을 구성하는 경우에도이 방법이 제대로 작동한다고 생각합니다.

그러나 Ubuntu 미러에는 기본 설치의 모든 패키지가 포함 된 "manifest"파일이 포함되어있는 것 같습니다. Ubuntu 12.04.3의 매니페스트는 다음과 같습니다.

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

이 페이지 또는 가까운 미러 페이지를 검색하는 경우 :

http://mirror.pnl.gov/releases/precise/

사용중인 버전 및 아키텍처에 해당하는 ".manifest"파일을 찾을 수 있어야합니다. 패키지 이름 만 추출하려면 다음과 같이하십시오.

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

목록은 이미 정렬되어 고유 한 것일 수 있지만 다음 단계를 더 쉽게 수행 할 수 있도록 올바르게 정렬되었는지 확인하고 싶었습니다. 그런 다음 출력을에 넣습니다 defaultinstalled.txt.

이 두 목록의 차이점을 어떻게 알 수 있습니까?

대부분의 유닉스 계열 시스템에는이를위한 많은 도구가 있기 때문에 이것이 가장 쉬운 부분입니다. 이 comm도구는 여러 가지 방법 중 하나입니다.

comm -23 currentlyinstalled.txt defaultinstalled.txt

첫 번째 파일에 고유 한 행 목록을 인쇄해야합니다. 따라서 기본 설치에없는 설치된 패키지 목록을 인쇄해야합니다.


첫 번째 파이프 라인은 무엇을하지 aptitude search '~i!~M' -F %p않습니까?
ephemient

@ephemient : 아마도 아무것도 아닙니다. 나는 적성에 대해 많이 알지 못하므로 내가 결코 사용하지 않는 프로그램의 man 파일을 파지 않고 익숙한 도구를 사용했습니다.
Steven D

1
당신은 종류의 내 희망을 파괴, 좀 표준 쉬운 방법 :(이라고 생각
phunehehe

3
이것은 거의 작동하지만 여전히 올바르지 않습니다. 결과 목록에 수동으로 설치하지 않은 여러 패키지와 라이브러리가 있습니다. 나는 http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest추가를 사용 | sed "s/ *$//"했지만 여전히 주사위는 없습니다.
jmiserez

1
의존성으로 설치되지 않은 패키지 목록을 얻는 첫 번째 단계 apt-mark showmanual | sort -u는 다른 답변에서 볼 수 있듯이 로 바꿀 수 있습니다 . 더 간단 aptitude하고 기본적으로 설치 되지 않은 것에 의존하지 않습니다 .
skagedal

24

이 두 개의 단일 라이너 중 하나를 사용할 수 있습니다. 둘 다 내 컴퓨터에서 정확히 동일한 결과를 산출 하며이 질문에서 지금까지 제안 된 모든 솔루션 (2014 년 7 월)보다 더 정확합니다. 두 답변 (1)(2) 의 조합입니다 . 원래이 답변을 여기에 게시했습니다 .

사용 apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

사용 aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

비록 언어 현지화 설정을 통한 설치 직후 또는 Totem 코덱 설치 프로그램을 통해 설치 한 직후에 사용자 실제로 설치 한 것으로 생각되지만 여전히 크랙을 겪는 패키지는 거의 없습니다 . 또한 비 버전 별 메타 패키지 만 설치했지만 Linux 헤더 버전도 누적되는 것처럼 보입니다. 예 :

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

작동 원리

  1. 수동으로 설치된 패키지 목록을 가져옵니다. 적성을 위해 추가로 sed줄 끝에 남은 공백이 제거됩니다.
  2. 새로 설치 한 직후에 설치된 패키지 목록을 가져옵니다.
  3. 파일을 비교하고 파일 2에없는 파일 1의 행만 출력하십시오.

다른 가능성도 잘 작동하지 않습니다.

  • 은 Using ubuntu-14.04-desktop-amd64.manifest파일 ( 여기에 대신 우분투 14.04를 들어) /var/log/installer/initial-status.gz. 더 많은 패키지가 설치되어 있지 않아도 수동으로 설치 한 것으로 표시됩니다.
  • apt-mark showauto대신에 사용 /var/log/installer/initial-status.gz. apt-mark예를 들어 xserver-xorg 패키지는 포함하지 않지만 다른 파일은 포함합니다.

둘 다 위의 솔루션보다 더 많은 패키지를 나열합니다.


초기 설치 이후 시스템을 업그레이드 한 경우 (대부분의 사람들이 생각하는 경우) 현재 Ubuntu 릴리스 버전의 매니페스트 파일을 사용하는 것이 좋습니다.
Diego V

업그레이드 한 경우 매니페스트 파일뿐만 아니라 두 파일을 모두 사용해야한다고 생각합니다. 다른 비교를 추가하면 쉽게 할 수 있습니다. 불행히도 매니페스트 파일에는 initial_status.gz 파일이 수행하는 모든 것이 포함되어 있지 않습니다 (확인했습니다).
jmiserez

나는 감동! 그러나 누락 된 조각을 발견했습니다. 처음에 설치 되었지만 명시 적 으로 수동으로 제거 되었지만 나중에 명시 적 으로 수동으로 재설치 된 패키지는 어떻습니까? 나는 작동하는 시스템에서 이것을 발견했다.
n611x007 9

1
나는 질문했습니다 목록 (APT) 명시 적으로 제거 패키지 : unix.SE/225330 작업의 대부분을 해결할 수 있습니다.
n611x007

1
mirror.pnl.gov/releases/precise/… 승인 된 솔루션의 URL은 이제 404
이므로이

9

에 따르면 man apt-mark:

apt-mark showauto
apt-mark showmanual

2
showmanual같은 것들을 보여주고 xserver-xorg-video-vesa내가 수동으로 설치하지 않은 맹세.
phunehehe

처음 설치시 배포판에 의해 자동으로 설치 될 수 있습니다.
Matt

8

다음은 일부 샘플 출력입니다 cat /var/log/apt/history.log.

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

귀하의 질문에 대해서는 grep ( cat /var/log/apt/history.log | grep Commandline)으로 물건을 필터링하십시오 .

이 파일은 회전되므로 다른 것을 확인하여 아무것도 놓치지 않도록하십시오.

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

참고 :

  • 둘 다 확인했습니다 적성시냅스 (버전 0.700.6.3 각각을), 그들은 모두 해당 로그 파일에 자신의 활동을 기록합니다. 그들과 함께 한 좌절은로 시작하는 라인이없는 것입니다 Commandline, 그래서 grep트릭이 그들과 함께 작동하지 않습니다.

2
재미있는 해결책. grep 명령을 약간 조정하여 패키지 목록을 가져 aptitude오거나 다른 패키지 관리자가 설치 한 패키지를 설명해야합니다 . 당신의 통나무가 회전했다면, 당신은 운이 좋지 않습니다.
Steven D

@steven 업데이트. 내 grep-fu는 초보자이므로 독자에게 맡길 것입니다. 또한 물건이 회전하는지 모르겠습니다. 나는 거기에 직접 파일을 제출해야합니다.
tshepang

회전 여부는 로그 회전 설정과 시스템 사용 시간에 따라 다릅니다. 우분투 기본값을 변경한지 오랜 시간이 지났기 때문에 확실하지 않습니다.
Steven D

7

이 쿼리를 검색하는 동안이 아름다운 oneliner를 발견했습니다.

하나의 라이너는

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

이 oneliner는 시스템의 로그를 사용하여 설치된 패키지를 필터링합니다. /var/log/installer/initial-status.gz

이 oneliner는 내 것이 아니며 내가 본 곳을 기억하지 못하는 것처럼 원래 스레드에 대한 링크를 게시 할 것입니다.


3

이 기사를 보고 싶을 것이다 .

이 기사의 끝에는 원하는 것을 수행해야하는 파이썬 스크립트가 있습니다.

(k) ubuntu 용으로 작성되었습니다 . 우분투 에서도 잘 작동합니다 .


3
링크가 더 이상 작동하지 않는 것 같습니다.
rog

2
이와 같은 깨진 링크는 답변에 관련 정보를 포함시키는 것이 중요합니다.
whitehat101

2

아래는 Steven D의 답변에 대한 추가 사항 입니다.

다음 줄은 패키지 이름을 32 자로 자릅니다.

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

이것은 작동하는 것 같습니다 :

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

이 답변을 참조하십시오


1

체크 아웃 /var/log/apt/term.log


2
그것은 다소 고통스러운 방법이며, 내가 설치 한 패키지와 의존성에 의해 가져온 패키지 사이에는 차이가 없습니다
phunehehe

동의하지만, apt가 그 점을 추적한다는 것을 몰랐습니다 : / Stefan에게 감사합니다 :)
Joril

1

파일을 볼 수도 있습니다 /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

이전 파티션에 설치된 것을 알고 싶을 때 유용합니다.


0

대본의 보석을 만든 사람들에게 큰 감사와 축하를 전합니다!
2 ¢를 추가하고 싶었고 $ info에서 추론 한 설치 날짜를 확인했습니다.
$ info 파일이 업데이트되는 이유와시기를 자세히 설명하지는 않았지만 실제로는 작동합니다.
내 스크립트에는 설치 후 추가 된 비 종속 패키지의 최신 업데이트가 나와 있습니다.
정기적으로 확인하면 한 번의 누락없이 수동으로 기록 한 내용을 볼 수있었습니다.
즉, 동일한 이유로 패킷 배치가 설치됩니다. 불행히도, 업데이트는 그 순서를 어 깁니다.
시스템 업그레이드 후 업그레이드가 업데이트하지 않은 추가 패키지 목록과 그 이후의 패키지 목록이있었습니다.
산뜻한! 즐겨.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.