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


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.70 및 0.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.