수동으로 설치된 패키지를 찾는 방법은 무엇입니까?


48

내 컴퓨터에 일반 Ubuntu 10.10을 설치하고 apt-get을 통해 일부 소프트웨어를 설치했습니다. 지난주에 나는 모든 것을 깨뜨리고 처음부터 시작했고 소프트웨어를 다시 설치해야한다. 수동으로 설치 한 모든 패키지로 목록을 작성하는 방법이 있습니까?

그것은 나에게 같은 목록을 제공 할 수 있도록 texlive, ...하지를 texlive, texlive-dep1, textlive-dep2, ...모든 표준 패키지는 제거?

내가 제거 한 정식 설치에서 어떤 프로그램을 알아낼 수 있다면 정말 좋을 것입니다!


2015-05-23 업데이트 : 이제 시스템에서 Ansible을 구성 관리로 사용합니다. 설치할 패키지를 지정합니다. 이것은 모든 프로그램을 새로운 시스템에 설치하는 것을 목표로합니다. 따라서이 질문은 간단한 구성 관리의 시작일 수 있습니다.

답변:


24

이 제안으로 이전 설치가 여전히 부팅된다고 가정합니다!

다른 시스템에서 한 패키지 세트를 복제하려면 다음을 수행하십시오.

시스템 A에서 다음을 실행하십시오.

dpkg --get-selections | grep -v deinstall > my-selections

my-selections파일을 시스템 B로 이동하십시오 .

시스템 B에서 다음을 실행하십시오.

dpkg --set-selections < my-selections

그리고:

sudo apt-get dselect-upgrade

중요 사항 : 비표준 리포지토리 및 / 또는 PPA에서 패키지를 설치 한 경우 업그레이드를 실행하기 전에 시스템 A에서 시스템 B로 /etc/apt/sources.list내용 을 복사 /etc/apt/sources.list.d/해야합니다.

dpkg제거한 내용도 확인할 수 있습니다 (NB : 여기에는 수동으로 설치 제거한 패키지도 포함됨 ).

dpkg --get-selections | grep deinstall

터미널에서 결과를 볼 수도 있고 물론 파일로 리디렉션 할 수도 있습니다.


9
모든 패키지 목록을 얻고 싶지만 명시 적으로 설치 한 패키지 이름 만 갖고 싶습니다. 그냥 그렇게 something하지 않습니다 something-common.
Martin Ueding

6
네, 이것이 유용하지만 질문이하는 것은하지 않습니다.
Timmmm

3
이렇게하면 프로그램을 제거 할 때 자동으로 설치된 종속성이 정리되지 않습니다. 사람들이 왜 자신이 원하지 않는다고 구체적으로 대답 한 답변을 투표에 올리는가?
jbo5112

20

superuser.com 의이 스레드 는이 솔루션을 제공합니다.

aptitude search '?installed ?not(?automatic)'

2
이것은 나를 위해 작동하지 않습니다. 설치되어 있거나 명시 적으로 요청한 것 이상을 나열합니다.
Timmmm

로 설치 한 모든 항목 apt-get과 해당 종속성 이 나열 됩니다. 예를 aptitudeapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
들어을

10

apt 로그가 / var / log / apt에 있으면 다음과 같이 작동합니다.

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

또는 출력에서 ​​일부 반복적 인 정크를 제거하려면 다음을 수행하십시오.

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

apt-mark 사용할 수 있지만 debfoster를 권장합니다 .

sudo apt-get install debfoster
sudo debfoster

설치된 모든 패키지를 검사하고 어떤 패키지가 다른 패키지를 계속 설치하는지 파악합니다.

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

각 질문에 대해 "y"로 대답하면 (Enter를 눌러 빠르게 이동), debfoster는 패키지 목록을 수집하여 한 줄씩 파일에 씁니다. 기본적으로이 값은 /var/lib/debfoster/keepers입니다. 다음과 같이 보입니다 :

gnome-do
texlive-full
...

/etc/debfoster.conf이 목록을 배치 /etc/debfoster-keepers하고 etckeeper 를 사용 하여 파일을 추적하여 기록 및 백업을 유지 하도록 debfoster를 통해 구성합니다 . 여기에 대답은 줄 바꿈으로 구분 된 텍스트 파일에서 패키지의 목록을 설치하는 방법을 보여줍니다 :

sudo apt-mark manual $(cat debfoster-keepers)

제거한 패키지 앞에는 '-'가 있습니다. 따라서 apt-mark를 호출하기 전에 해당 줄을 제거하고 싶습니다.

비록 debfoster의 웹 사이트 가 debfoster가 적성을 선호하여 더 이상 사용되지 않는다고 말하지만, 나는 debfoster의 신속하고 간단한 구성을 선호합니다. 패키지 데이터베이스의 한가운데서 작업을 정리하여 자동수동 패키지를보다 명확하게 만듭니다.

옵션을 설명하려면 debfoster 프롬프트에 "h"를 입력하십시오. "?"를 입력하십시오. 패키지 설명을 참조하십시오. 이 방법 은 유용 할 수 있습니다.


5
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

시스템 패키지가 아닌 종속성이 아닌 수동으로 설치된 모든 패키지를 제공합니다. 예를 들어 표시 build-essential되지만 gcc.


3

apt- * 도구를 선호하는 사람들을 위해 수동 / 자동 상태를 쿼리하고 수정하는 apt-mark 유틸리티가 있습니다.

apt-mark showmanual

관심있는 패키지의 패턴을 지정할 수도 있습니다.

apt-mark showmanual qemu\*

티켓입니다.
John Von Neumann

2

나는 마침내 그것을 얻었다 :

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

2
적성을 사용하여 패키지를 설치 한 경우에만 작동한다고 생각합니다. /var/log/apt/history.log(.N.gz)그래도 비슷한 파일이 있습니다 .
Timmmm

zgrep대신 gunzip또는로 zcat파이프 할 수 있습니다 grep. gzip과 함께 제공되는 래퍼 스크립트입니다. 압축되지 않은 파일도 허용하므로 다음과 같이 스크립트를 단순화 할 수 있습니다.zgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas

2

/ var / log / apt /에서 로그 파일을 열어 모든 것을 가져올 수 있습니다.

그런 다음 apt-get 설치 패키지를 수동으로 걸러냅니다. 프로그래밍 방식 으로이 작업을 수행 할 수있는 방법이있을 수 있지만 잘 모르겠습니다.


1
cd /var/log/apt
cat  history.log | grep Commandline

이런 식으로 과거에 수행 된 명령 목록을 볼 수 있습니다.

추가 정보가 필요한 경우 grep 코드를 제거하십시오.

less history.log

로그가 압축 된 경우 (즉, gz로 끝남)

gunzip <filename>

완료되면 다시 압축하려면 다음을 수행하십시오.

gzip <filename>

1
로그 파일을 압축 해제했다가 다시 압축하는 대신에 zcat? 만큼 쉽다 zcat filename.gz. 대신 gzip 압축 파일에서 사용할 수 있습니다 cat. 또한 grep교체 할 수 있습니다 zgrep예를 들어, zgrep Commandline history.log.1.gz.
lgarzo

귀하의 아이디어를 바탕으로 명령 줄을 만들었습니다 (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". 제거 된 패키지도 나열되기 때문에 결함이 있으며 패키지가 두 번 이상 설치된 경우 여러 번 나열됩니다.
lgarzo

1

나는 여기에 어떤 해결책도 효과가 없다는 것을 보지 못했다. 나는 dpkg와 함께 꽤 많은 deb 패키지를 설치했으며 특히 내가 찾고있는 몇 가지 항목이 누락되었다.

다소 긴 라이너이지만 복사하여 붙여 넣기가 편리한 방법은 다음과 같습니다.

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

위 명령은 패키지 목록을 현재 작업중인 디렉토리의 파일에 저장합니다 my-packages.

설명

먼저 설치 중에 선택한 패키지의 기준을 구성하는 패키지 목록을 작성했습니다.

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

일반적으로 설치된 긴 항목 목록이 뒤 따릅니다.

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

나는 다음 두 파일을 비교 initialinstalled설치에 고유 한 항목 만 나열합니다.

comm -23 installed initial > custom

거기에서 종속성을 필터링하고 싶었습니다.이 방법은 원하는 패키지를 놓칠 수있는 곳이며, 명시 적으로 설치된 종속성을 알지 못합니다.

이 항목을 처리 할 때이 단계를 단축하기 위해 빠른 bash 함수를 작성했습니다.

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

그 후 나는 파일에서 각 줄 custom을이 함수로 전달 했다 xargs.

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

가능한 모든 의존성에 대한 긴 목록 (모든 가능한 진술에 대해 확실하지 않음)을 얻은 후에는 단일 파일에 고유 한 행을 다시 얻었습니다.

comm -23 custom deps > manual

완성 된 패키지 목록은 이제 manual검토 할 수 있는 파일 이름으로되어 있습니다.


0

https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624에 연결된 누군가 좋은 해결책이 있지만 적성의 결과로 올바르게 작동하지 않습니다 변경되었습니다. 다음은 현재 설치된 패키지와 12.04 LTS를 비교 한 업데이트 된 버전입니다. aptitude설치 가 필요 합니다. 이것이 유일한 요구 사항입니다.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

위의 명령을 여러 부분으로 나누기 위해이 비트는 시스템에 설치된 모든 항목의 라인 당 하나의 패키지를 출력합니다.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

그리고 이것은 기본 패키지 목록을 다운로드하고 중복 정보를 자릅니다.

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled

그리고 comm두 파일을 비교하고 기본 목록에서이 arent 패키지를 출력합니다.

comm -23 currentlyinstalled defaultinstalled

다른 사이트로 이동하여 답변을 업데이트 할 수도 있습니다.
Martin Ueding

0

배포 매니페스트 파일을 기본 패키지 세트로 사용하십시오. 수동으로 설치된 결과를 아키텍처 및 섹션별로 패키지 그룹으로 정렬하면 패키지 그룹에보다 쉽게 ​​집중할 수 있습니다 (일부 섹션은 신경 쓰지 않아도 됨).

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently_installed.txt

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

각 행에 접두사가 붙고 apt-get install -y 파일이 bash 스크립트가 되도록 패키지 파일을 쉽게 수정할 수 있습니다 . 그런 다음 모든 패키지 파일을 vagrant provision loop에 포함시킬 수 있습니다.
대런 웨버

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

나에게 적합한 것을 찾지 못해서 대본을 썼습니다. /var/log/apt/history.log* 및 / var / log / aptitude의 내용을 분석 한 후 날짜 시간별로 정렬하여 두 개의 목록을 생성합니다. 하나는 수동으로 pkg을 설치하고 다른 하나는 pkg를 설치하지만 제거합니다. 'apt list'검증이있는 스크립트. dpkg를 사용하여 PPA 소스를 설치하고 수정했기 때문에 약간의 편차가 있습니다.

나는 여기에 https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl을 넣었습니다 .

누군가 테스트해야 할 경우 코드를 수정해야 할 수도 있습니다. 내 로그 파일이 중국어와 영어 (특히 RFC2822 날짜 시간 형식)로 혼합되어 있기 때문에 처리해야합니다. 여기에 이미지 설명을 입력하십시오


읽을 수없는 텍스트의 스크린 샷은 무엇입니까?
muru

내 스크립트 출력입니다. 그러나 오늘 Fedora의 dnf가 더 효과적이라는 것을 알았습니다. "dnf history"는 패키지 작업의 순수한 이력을 보여줍니다.
utopic eexpress

0

/var/log/apt/history.log변경 사항을 적용하기 위해 사용하기를 원한다고 생각합니다 .

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

( 소스 에서 수정 )

변형을 사용하여 명령 행에 설치된 모든 패키지를 제공합니다 apt-get install.

이전 파일의 압축 파일을 가져 와서 현재 파일을 history.log추가하고 history.loggrep을 통과하여 apt [-get] install [및 / 또는 다시 설치]로 줄을 추출하고 나머지 줄 (-o 플래그)을 표시합니다. 패키지 이름.

sed별도의 줄에 패키지 이름 만 원한다면 약간의 모딩이 필요합니다 (예 :) . 독자를위한 운동!

"status"섹션 의 시냅틱 패키지 관리자 ( gksu synaptic또는 kdesudo synaptic)에 "installed (manually)"목록이 있다는 점은 주목할 가치가 있습니다. 전체 목록을 제거 표시 [해당하지 마십시오 !!]로 표시하면 표시된 변경 사항을 저장하고 패키지 목록을 가져올 수 있습니다. 주의 : 이것은 synaptic나를 위해 잠겨 있습니다 (종종 종속성 제거를 계산하는 것).


다른 곳 에서 내 대답 에서 복사했습니다 .
pbhj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.