답변:
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
첫 번째 파일에 고유 한 행 목록을 인쇄해야합니다. 따라서 기본 설치에없는 설치된 패키지 목록을 인쇄해야합니다.
http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest
추가를 사용 | sed "s/ *$//"
했지만 여전히 주사위는 없습니다.
apt-mark showmanual | sort -u
는 다른 답변에서 볼 수 있듯이 로 바꿀 수 있습니다 . 더 간단 aptitude
하고 기본적으로 설치 되지 않은 것에 의존하지 않습니다 .
이 두 개의 단일 라이너 중 하나를 사용할 수 있습니다. 둘 다 내 컴퓨터에서 정확히 동일한 결과를 산출 하며이 질문에서 지금까지 제안 된 모든 솔루션 (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
작동 원리
sed
줄 끝에 남은 공백이 제거됩니다.다른 가능성도 잘 작동하지 않습니다.
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 패키지는 포함하지 않지만 다른 파일은 포함합니다.둘 다 위의 솔루션보다 더 많은 패키지를 나열합니다.
다음은 일부 샘플 출력입니다 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
참고 :
Commandline
, 그래서 grep
트릭이 그들과 함께 작동하지 않습니다.aptitude
오거나 다른 패키지 관리자가 설치 한 패키지를 설명해야합니다 . 당신의 통나무가 회전했다면, 당신은 운이 좋지 않습니다.
이 쿼리를 검색하는 동안이 아름다운 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는 내 것이 아니며 내가 본 곳을 기억하지 못하는 것처럼 원래 스레드에 대한 링크를 게시 할 것입니다.
이 기사를 보고 싶을 것이다 .
이 기사의 끝에는 원하는 것을 수행해야하는 파이썬 스크립트가 있습니다.
(k) ubuntu 용으로 작성되었습니다 . 우분투 에서도 잘 작동합니다 .
아래는 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 ¢를 추가하고 싶었고 $ 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
aptitude search '~i!~M' -F %p
않습니까?