패키지를 수동으로 설치 apt
하거나 패키지가 수동 또는 자동으로 설치 aptitude
되었는지 확인할 수 있습니다 foobar
. 커맨드 라인에서 깔끔한 방법이 있습니까?
패키지를 수동으로 설치 apt
하거나 패키지가 수동 또는 자동으로 설치 aptitude
되었는지 확인할 수 있습니다 foobar
. 커맨드 라인에서 깔끔한 방법이 있습니까?
답변:
이 두 개의 단일 라이너 중 하나를 사용할 수 있습니다. 둘 다 내 컴퓨터에서 정확히 동일한 결과를 산출 하며이 질문에서 지금까지 제안 된 모든 솔루션 (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
작동 방식 :
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 패키지는 포함하지 않지만 다른 파일은 포함합니다.다양한 다른 StackExchange 게시물을 참조로 사용했지만 위의 해결책뿐만 아니라 아무것도 작동하지 않습니다.
둘 다 위의 솔루션보다 더 많은 패키지를 나열합니다.
편집 : 이전 릴리스에서 업그레이드 한 경우 수행 할 작업 :
Ubuntu를 한 릴리스에서 다음 릴리스로 업그레이드 한 경우이 프로세스를 조정해야합니다. 이 경우 현재 릴리스의 initial-status.gz 파일 외에도 최신 릴리스의 매니페스트 파일 (위 참조)을 확인합니다. 다른 비교를 추가하면 쉽게 할 수 있습니다. 매니페스트 파일에 불행하게도 initial_status.gz 파일이 수행하는 모든 것이 포함되어 있지 않기 때문에 매니페스트 파일 만 사용하면 작동하지 않습니다 (체크).
/var/log/installer/initial-status.gz
습니다. 또한 이것이 아파트 표시에 의존하는지 여부를 알고 싶습니다 manual
.
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을 수동으로 설치 한 것이 확실합니다 ...) [죄송합니다. 동일;)]
최신 버전의 패키지 apt에는 apt-mark 명령도 있습니다
apt-mark showmanual
linux-image-3.11.0-*-generic
수동 으로 간주 할 이유가 없습니다
linux-image-3.13.0-24-generic
수동이지만 전류 linux-image-3.13.0-27-generic
는 자동입니다. 참조 패키지의 업그레이드 (이 경우 linux-image-generic
종속성을 변경 한) 수동 표시가 자동으로 설정되는 것 같습니다
apt-get autoremove
. 이것은 분명히 당신이 원하는 것이 아닙니다.
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 데스크탑 앱에서 설치를 선택하지 않는 것 같습니다.
apt-mark showauto | grep -iE '^foobar$'
패키지가 자동으로 설치되면 "foobar"가 출력됩니다.
aptitude search '!~M ~i'
자동으로 설치되지 않은 패키지가 나열됩니다. 10.10부터 Ubuntu Desktop의 기본 설치에 포함되지 않는 것이 유감입니다.
aptitude search
수동으로 설치되는 패키지뿐만 아니라 모든 패키지를 표시합니다 (OP가 원하는 것으로 가정)
aptitude search '!~M ~i'
하고 있으며 1043 패키지가 나열되어 있습니다. 많은 패키지를 수동으로 설치하는 방법은 없습니다.
다음 스크립트는 자동 설치로 설정되지 않아 수동으로 설치된 모든 패키지를 인쇄합니다.
#!/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가 자동으로 설치된 패키지를 인쇄하는 방법을 기반으로합니다.
sys.exit(1)
없이 사용하면 import sys
최신 버전의 파이썬에서 오류가 발생할 수 있습니다. 하나 import sys
또는 사용 exit(1)
.
모든 패키지 목록을 가져 오려면 (모든 PPA에서 설치, 사용자 설치 또는 기본적으로 설치되지 않음) apt
다음 방법을 사용하십시오.
apt list [option]
이에 유용한 옵션은 다음과 같습니다.
--installed
시스템에 설치된 패키지 만 표시 (약 50,000 개 이상)
--manual-installed
직접 또는 종속성으로 명령에 의해 명시 적으로 설치된 패키지를 나열합니다 .
또는 다음을 수행 할 수 있습니다.
apt list --manual-installed | grep -F \[installed\]
사용자 명령 및 해당 종속성만으로 생성 된 패키지 목록을 얻고 지원되는 버전 및 아키텍처 (x86, x86_64, amd64 등)와 같은 추가 정보를 얻습니다.
여러 사람들이 언급했듯이 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 가지 항목의 매우 짧은 목록이었습니다.
sys.exit(1)
없이 사용하면 import sys
최신 버전의 파이썬에서 오류가 발생할 수 있습니다. 하나 import sys
또는 사용 exit(1)
.
GUI 솔루션을 제공하고 싶습니다.
열다 Synaptic Package Manager
이동 Status
딸깍 하는 소리 Installed (manual)
apt 또는 aptitude로 수동으로 설치된 패키지 목록을 제공합니다.
불행히도 패키지가 수동 또는 자동으로 설치 Custom Filters
되었는지 여부를 알 수있는 옵션을 찾을 수 없었습니다 foobar
.
패키지가 아래에 Installed
있지만 패키지가 없으면 Installed (manual)
자동으로 설치되었습니다. 패키지가 아래 Installed (manual)
에 있으면 수동으로 설치 한 것입니다.
apr-something 명령을 사용하여 훌륭한 답변을 제공하지 못하면 어려운 방법으로 할 수 있습니다 . Apt-get은 정보를 / var / lib / apt / extended_states에 저장합니다. 자동으로 설치된 모든 파일이이 파일에 추가됩니다. 이 파일에 이미 패키지를 수동으로 설치 한 경우 패키지는이 파일에 남아 있지만 두 번째 줄에는 자동 설치 : 0으로 남아 있습니다. 삭제되지 않았습니다.
참고 : 파일 배치 변경 사항이 나타난 경우 더 나은 답변이 예상됩니다. 파일 위치에 대한 정보가 유용한 경우를 대비하여 내 것을 유지합니다.
apt-get install liferea
설치했지만 설치하지 않았지만 "수동으로 설치된 것으로 표시"된 결과 인 출력을 얻었습니다. 이제 liferea는 여전히 파일에 있습니다. 단, 다음 행에 0
대신 1
.이 있습니다. 또한 정규식 패턴을 " foobar$"
그냥 대신로 변경해야합니다 foobar
.
인터넷 검색을 많이 한 후에이 스크립트를 작성했습니다. 그것은 나를 위해 잘 작동합니다 :
# 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을 사용할 수 있습니다.
apt-mark
일부 패키지의 아키텍처를 표시 할 수 있지만로는 많지 않습니다 dpkg -l
.
apt-cache search
느립니다. help.ubuntu.com/community/ListInstalledPackagesByDate 와 같은 것을 사용하여 설치 날짜 목록을 미리 얻는 것이 더 효율적일 수 있습니다
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습니다. 이것은 무엇을 하는가?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
;)
종속성, 설치 제거 된 패키지, 시스템 설치 중에 설치된 패키지없이 수동으로 설치된 모든 패키지가 나열됩니다.
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
}