it-swarm-ko.tech

명시 적으로 설치된 패키지 나열

젠투에는 /var/lib/portage/world 여기에는 명시 적으로 설치 한 패키지가 포함되어 있습니다. 명시 적으로 말하자면 기본적으로 설치되거나 종속성에 의해 가져온 것을 포함하지 않는 패키지를 선택합니다.

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

53
phunehehe

코드 만

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

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

46
Steven D

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

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)

비록 언어 현지화 설정을 통한 설치 직후 또는 예를 들어, 사용자가 실제로 설치 한 것으로 생각되는 are 패키지가 여전히 크랙을 겪고있는 패키지는 거의 없습니다. 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의 행만 출력하십시오.

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

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

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

24
jmiserez

man apt-mark에 따르면 :

apt-mark showauto
apt-mark showmanual
9
mmaruska

다음은 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

NOTE :

  • aptitudesynaptic (각각 버전 .7.6.)을 모두 확인했으며 둘 다 기록합니다. 해당 로그 파일에 대한 활동 그들과의 한 가지 단점은 Commandline로 시작하는 줄이 없으므로 grep 트릭은 작동하지 않는다는 것입니다.
8
tshepang

이 쿼리를 검색하는 동안이 아름다운 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는 내 것이 아니며 내가 본 곳을 기억하지 못하는 것처럼 원래 스레드에 대한 링크를 게시 할 것입니다.

7
Archit

이 기사 를 살펴보고 싶을 것입니다.

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

(k) 우분투 로 작성되었습니다. 그러나 우분투 에서도 작동합니다.

3
Stefan

아래는 Steven D의 답변 에 추가 된 것입니다.

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

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

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

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

이 답변 참조

2
Wes Turner

/var/log/apt/term.log를 확인하십시오

1
Joril

/var/lib/apt/extended_states.

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

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

1
Laurent Lyaudet

대본의 보석을 만든 사람들에게 큰 감사와 축하를 전합니다!
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
0
Papou