수동으로 설치된 패키지 목록 생성 및 개별 패키지 쿼리


183

패키지를 수동으로 설치 apt하거나 패키지가 수동 또는 자동으로 설치 aptitude되었는지 확인할 수 있습니다 foobar. 커맨드 라인에서 깔끔한 방법이 있습니까?


스톡 패키지를 걸러내는 솔루션 에 대해서는 unix.stackexchange.com에서이 답변을 참조하십시오 .
Dirk Bergstrom

가능한 중복? - askubuntu.com/questions/365
JRG



답변의 의견에주의하십시오. 사람들은 더 많은 패키지가 표시되는 방식을 말하지는 않지만 수동 설치로 설치된 종속성 패키지가 있다는 것을 잊고 있습니다.
Andre Figueiredo

답변:


206

이 두 개의 단일 라이너 중 하나를 사용할 수 있습니다. 둘 다 내 컴퓨터에서 정확히 동일한 결과를 산출 하며이 질문에서 지금까지 제안 된 모든 솔루션 (2014 년 7 월 6 일)보다 정확합니다.

사용 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 패키지는 포함하지 않지만 다른 파일은 포함합니다.

다양한 다른 StackExchange 게시물을 참조로 사용했지만 위의 해결책뿐만 아니라 아무것도 작동하지 않습니다.

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

편집 : 이전 릴리스에서 업그레이드 한 경우 수행 할 작업 :

Ubuntu를 한 릴리스에서 다음 릴리스로 업그레이드 한 경우이 프로세스를 조정해야합니다. 이 경우 현재 릴리스의 initial-status.gz 파일 외에도 최신 릴리스의 매니페스트 파일 (위 참조)을 확인합니다. 다른 비교를 추가하면 쉽게 할 수 있습니다. 매니페스트 파일에 불행하게도 initial_status.gz 파일이 수행하는 모든 것이 포함되어 있지 않기 때문에 매니페스트 파일 만 사용하면 작동하지 않습니다 (체크).


7
이 없기 때문에 이것은 나에게 효과가 없었 /var/log/installer/initial-status.gz습니다. 또한 이것이 아파트 표시에 의존하는지 여부를 알고 싶습니다 manual.
Anwar

1
아아 서버 버전에 대한 매니페스트가 없습니다.
Antti Haapala

나는 showmanual명령을 (아래) 실행했다 . 그리고 comm두 개의 정렬 된 목록을 비교하는 데 사용 하십시오. showmanual결과는 나에게 1840 개 준 이상 에서 독특한 패키지를 apt-mark showmanual이 방법으로 도시하지 않음. 이 comm명령 의 출력에 고유 한 패키지는 없습니다 . 내 PC의 경우 894 패키지가 두 결과에 모두 나열되어 있다는 것이 더 흥미 롭다고 생각합니다 . 왜 그렇게 큰 불일치가 있는지 확실하지 않습니다. 일부 (많은?) 패키지는 릴리스에 특정한 것 같습니다. XOrg, GTK 구성 요소 및 lib*사물 과 같은 다른 것들도 업데이트 될 수 있습니다. 어쨌든 이 대답은 아주 좋은 시작입니다.
것입니다

방금 귀하의 솔루션을와 비교했습니다 apt-mark showmanual. 얼마나 많은 차이점이 보이는지 흥미 롭습니다. 귀하의 목록에는 238 개의 패키지가 있으며 showmanual은 1717 개의 패키지를 반환합니다. 2179가 설치된 패키지 중 두 목록에 모두 223 개만 있고 15 개는 사용자 만 해당 (예 : nodejs, lightdm)이고 223 개는 실용적입니다 (예 : xserver-xorg, ubuntu-desktop). 목록이 더 도움이 될 것 같지만 이러한 차이점이 어디에서 왔는지 알지 못하면 결정하기가 쉽지 않습니다 ... (하지만 nginx와 lightdm을 수동으로 설치 한 것이 확실합니다 ...) [죄송합니다. 동일;)]
Daniel Alder

64

최신 버전의 패키지 apt에는 apt-mark 명령도 있습니다

apt-mark showmanual

35
이것은 수동으로 설치 한 것보다 더 많은 패키지를 보여줍니다.
Umang

1
@Umang 당신이 맞아요. 나는이 답변을 쓸 때 이것이 좋지 않았다고 말할 것입니다. 시스템에서 linux-image-3.11.0-*-generic수동 으로 간주 할 이유가 없습니다
Daniel Alder

1
@Umang 어쩌면 이것은 당신을 도울 것입니다 askubuntu.com/questions/432743/... 하지만 대답은 허용되지 않습니다. 사실 새로 설치 한 많은 패키지가 이미 수동으로 표시되어 있습니다. 그러나 여전히 이상한 것들이 있습니다. 내 예를 유지하려면 linux-image-3.13.0-24-generic수동이지만 전류 linux-image-3.13.0-27-generic는 자동입니다. 참조 패키지의 업그레이드 (이 경우 linux-image-generic종속성을 변경 한) 수동 표시가 자동으로 설정되는 것 같습니다
Daniel Alder

5
@DanielAlder 새로 설치 한 일부 패키지는 수동으로 표시해야합니다. 수동으로 표시된 패키지가없는 경우 전체 시스템을로 삭제할 수 있습니다 apt-get autoremove. 이것은 분명히 당신이 원하는 것이 아닙니다.
Anton K

2
"수동으로 설치"가 "초기 OS 설치 후 사용자가 설치"를 의미하는 경우에는 정답이 아닙니다.
Seamus

21

Ubuntu 16.04의 경우 로그 파일을 확인하십시오 /var/log/apt/history.log.

예를 들면 다음과 같습니다.

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

완벽하지는 않지만 손으로 ​​직접 설치 한 것을 명확하게하는 것이 좋습니다. 을 넣어 -B 1가 설치 될 때 볼 수있는 GREP에.

출력 예

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

이것이 선택되는지 확실 aptitude하지 않습니다. Ubuntu Software 데스크탑 앱에서 설치를 선택하지 않는 것 같습니다.


1
수년에 걸친 모든 답변 중에서 이것은 18.04 서버에서도 가까운 유일한 것입니다.
Quentin Skousen

20

apt-mark showauto | grep -iE '^foobar$' 패키지가 자동으로 설치되면 "foobar"가 출력됩니다.

aptitude search '!~M ~i'자동으로 설치되지 않은 패키지가 나열됩니다. 10.10부터 Ubuntu Desktop의 기본 설치에 포함되지 않는 것이 유감입니다.


aptitude search수동으로 설치되는 패키지뿐만 아니라 모든 패키지를 표시합니다 (OP가 원하는 것으로 가정)
Oli

1
@Oli : 적성 검색 패턴을 살펴보십시오. 내가 사용하는 패턴은 OP가 원하는 것을 정확하게 수행해야합니다.
Li Lo

나는 그것을 달렸다 . 설치되지 않은 패키지의 전체로드를 보여줍니다.
Oli

7
이것에 문제가 있습니다. 사용 aptitude search '!~M ~i'하고 있으며 1043 패키지가 나열되어 있습니다. 많은 패키지를 수동으로 설치하는 방법은 없습니다.
ThatGraemeGuy

요청한대로 작동하지 않으며 사전 설치된 패키지도 인쇄합니다.
Irfy

9

다음 스크립트는 자동 설치로 설정되지 않아 수동으로 설치된 모든 패키지를 인쇄합니다.

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

apt-mark가 자동으로 설치된 패키지를 인쇄하는 방법을 기반으로합니다.


괜찮습니다. 이것은 실제로 받아 들여진 대답과 달리 작동합니다.
Irfy

나를 위해 몇 가지 패키지를 보여주십시오.
Rmano

내가 설치 한 직후에 수동으로 설치된 패키지가 없어진 것과 같습니다.
David Ljung Madison 1

sys.exit(1)없이 사용하면 import sys최신 버전의 파이썬에서 오류가 발생할 수 있습니다. 하나 import sys또는 사용 exit(1).
Videonauth

7

모든 패키지 목록을 가져 오려면 (모든 PPA에서 설치, 사용자 설치 또는 기본적으로 설치되지 않음) apt다음 방법을 사용하십시오.

apt list [option]

이에 유용한 옵션은 다음과 같습니다.

--installed 시스템에 설치된 패키지 만 표시 (약 50,000 개 이상)

--manual-installed직접 또는 종속성으로 명령에 의해 명시 적으로 설치된 패키지를 나열합니다 .

또는 다음을 수행 할 수 있습니다.

apt list --manual-installed | grep -F \[installed\] 사용자 명령 및 해당 종속성만으로 생성 된 패키지 목록을 얻고 지원되는 버전 및 아키텍처 (x86, x86_64, amd64 등)와 같은 추가 정보를 얻습니다.


5

여러 사람들이 언급했듯이 apt-mark showmanual은 약간 버그가있는 것 같습니다 (그리고 버그 727799 로보 고했습니다 ). 내가 그것을 사용할 때 실제로는 / var / lib / apt / extended_states (이것으로 저장되어 있어야 함)에 로그인하지 않은 많은 것들을보고하고 apt-get은 설치된 것으로 로깅하지 않습니다. / var / lib / apt / extended_states (/ var / lib / dpkg / status에 있음). 위의 txwikinger의 python 스크립트는 / var / lib / apt / extended_states에서 직접 가져 오지만 오늘 사용하면 구문이 작동하지 않을 수 있습니다 (쿠분투 13.10에서 오류가 발생하기 시작했습니다). 업데이트 된 구문은 다음과 같습니다.

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

나에게 이것은 매우 정확하지 않은 5 가지 항목의 매우 짧은 목록이었습니다.


1
sys.exit(1)없이 사용하면 import sys최신 버전의 파이썬에서 오류가 발생할 수 있습니다. 하나 import sys또는 사용 exit(1).
Videonauth

4

GUI 솔루션을 제공하고 싶습니다.

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

  1. 열다 Synaptic Package Manager

  2. 이동 Status

  3. 딸깍 하는 소리 Installed (manual)

apt 또는 aptitude로 수동으로 설치된 패키지 목록을 제공합니다.

불행히도 패키지가 수동 또는 자동으로 설치 Custom Filters되었는지 여부를 알 수있는 옵션을 찾을 수 없었습니다 foobar.

패키지가 아래에 Installed있지만 패키지가 없으면 Installed (manual)자동으로 설치되었습니다. 패키지가 아래 Installed (manual)에 있으면 수동으로 설치 한 것입니다.


2

apr-something 명령을 사용하여 훌륭한 답변을 제공하지 못하면 어려운 방법으로 할 수 있습니다 . Apt-get은 정보를 / var / lib / apt / extended_states에 저장합니다. 자동으로 설치된 모든 파일이이 파일에 추가됩니다. 이 파일에 이미 패키지를 수동으로 설치 한 경우 패키지는이 파일에 남아 있지만 두 번째 줄에는 자동 설치 : 0으로 남아 있습니다. 삭제되지 않았습니다.

참고 : 파일 배치 변경 사항이 나타난 경우 더 나은 답변이 예상됩니다. 파일 위치에 대한 정보가 유용한 경우를 대비하여 내 것을 유지합니다.


1
아니요. 해당 파일을 간단히 살펴보면 liferea가 자동 설치로 표시되어 있습니다. 내가 apt-get install liferea설치했지만 설치하지 않았지만 "수동으로 설치된 것으로 표시"된 결과 인 출력을 얻었습니다. 이제 liferea는 여전히 파일에 있습니다. 단, 다음 행에 0대신 1.이 있습니다. 또한 정규식 패턴을 " foobar$"그냥 대신로 변경해야합니다 foobar.
Umang

사실입니다. 내 잘못, 내 시스템에는 0 행이 없지만 드물게 발생해야합니다. 만약을 대비하여 답변을 업데이트합니다.
Javier Rivera

2

인터넷 검색을 많이 한 후에이 스크립트를 작성했습니다. 그것은 나를 위해 잘 작동합니다 :

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done

sort -u대신에 사용할 수 있습니다 sort | unique. 으로 apt-mark아키텍처를 표시하지 않습니다, 당신은 설정 작업하기 전에의 dpkg를 출력에서 스트립 (또는 사용한다 dpkg-query -W -f='${Package}\n'). 또한 dpkg는 현재 설치되지 않은 일부 패키지를 나열 할 수 있습니다. "desc"에 대해서는`dpkg-query -W -f = '# $ {binary : Summary} \ n'$ pack을 사용할 수 있습니다.
jarno

아, apt-mark일부 패키지의 아키텍처를 표시 할 수 있지만로는 많지 않습니다 dpkg -l.
jarno

apt-cache search느립니다. help.ubuntu.com/community/ListInstalledPackagesByDate 와 같은 것을 사용하여 설치 날짜 목록을 미리 얻는 것이 더 효율적일 수 있습니다
opticyclic

1

Li Lo가 말했듯이 apt-mark showauto자동으로 설치되는 뚱뚱한 목록을 가져와야합니다.

이제 수동으로 설치되는 것을 보여주기 위해 적성을위한 멋진 간단한 검색 수정자가 있음이 밝혀졌습니다. 그러나 당신은 그것을하고 싶지 않습니다. 로켓 과학을 수행하는 거대한 bash 명령을 작성하려고합니다.

참고 : 다음은 모든 친구에게 방대한 bash 명령을 사용하는 것이 얼마나 멋진 지 보여줍니다.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

가독성을 위해 두 줄로 나 bro습니다. 이것은 무엇을 하는가?

  • 먼저 dpkg에 설치된 패키지 목록을 쿼리합니다.
  • 우리는 실제로 설치된 것 (잔여 구성뿐만 아니라)에 대해 필터링합니다.
  • 우리는 상태를 잘라
  • 우리는 그 목록을 자동 목록과 비교합니다. apt-mark
  • 우리는 할 수 있기 때문에 흔들리고 있습니다.

dpkg는 종종 설치되지 않은 패키지를 보여주기 때문에 이것이 정확한지 의심합니다
txwikinger

무슨 말인지 알지만 내 bash-fu는 충분하지 않습니다. 나는 당신이 dpkg-query에서 상태를 보여줄 수 있다는 것을 알고 있습니다. 갈 게요
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort);)
LassePoulsen

-1

종속성, 설치 제거 된 패키지, 시스템 설치 중에 설치된 패키지없이 수동으로 설치된 모든 패키지가 나열됩니다.

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.