설치 날짜별로 적절한 기반 시스템의 패키지 목록


104

설치 날짜별로 설치된 패키지를 어떻게 나열합니까?

데비안 / 우분투 에서이 작업을 수행해야합니다. 다른 배포판에 대한 답변도 좋습니다.

특정 코드를 컴파일하기 위해 많은 것들을 설치했으며 설치해야 할 패키지 목록을 얻고 싶습니다.


1
apt-get install 이력을 얻는 방법 도 참조하십시오 .
Mikel

1
운이없이 "apt release date"에 대해 인터넷 검색을하고 있었을 것입니다.이 의견은 향후 Google 직원에게 도움이 될 것입니다.
ThorSummoner 2018

답변:


66

Red Hat과 같은 RPM 기반 배포는 쉽습니다.

rpm -qa --last

데비안 및 기타 dpkg 기반 배포판에서 특정 문제도 쉽습니다.

grep install /var/log/dpkg.log

로그 파일이 회전되지 않은 경우 다음을 시도해야합니다.

grep install /var/log/dpkg.log /var/log/dpkg.log.1

일반적으로, dpkg그리고 apt에서 이러한 필드의 부족으로 가고, 설치 날짜를 추적하지 않는 것 dpkg-query매뉴얼 페이지를 참조하십시오.

결국 오래된 /var/log/dpkg.log.*파일은 로그 회전에 의해 삭제되므로 시스템의 전체 기록을 보장 할 수는 없습니다.

몇 번 나타나는 제안 (예 : 이 스레드 )은 /var/lib/dpkg/info디렉토리 를 보는 것 입니다. 거기에 제안 된 파일은 다음과 같이 시도해 볼 수 있습니다.

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

선택에 대한 질문에 대답하기 위해 첫 번째 단계가 있습니다.

날짜별로 패키지 목록 작성

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

설치된 패키지의 빌드 목록

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

2리스트에 가입

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

어떤 이유로 든 나에게 많은 차이가 인쇄되지 않으므로 --get-selections의미 가 무엇인지에 대한 버그 또는 잘못된 가정이있을 수 있습니다 .

당신은 분명히 사용하여 두 패키지를 제한 할 수 있습니다 find . -mtime -<days>또는 head -n <lines>, 예를 들면, 그리고 당신이 원하는대로 출력 형식을 변경

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

지난 4 일 동안 설치된 (변경된) 선택 항목 만 나열합니다.

sort사용 된 정렬 순서를 확인한 후 명령을 제거하고 명령을 보다 효율적으로 dpkg --get-selections만들 수도 find있습니다.


8
나는 보통 apt-get이상을 좋아 rpm하지만 데비안은 데이터베이스에 설치 날짜를 저장하지 않아서 -1을 얻습니다. 데비안 트릭에는 선택한 패키지 뿐만 아니라 설치된 모든 패키지가 포함 되지만 좋은 시작입니다.
Elazar Leibovich

데비안의 half-installed경우 다음과 같은 경우에 쪼개짐이 줄어 듭니다 ( 항목 제거 ).grep install\ /var/log/dpkg.log
Pierz

@Mikel-훌륭한 답변입니다. '/var/lib/dpkg/info/*.list 파일 정보 수집'을 확장하고 "최상위 패키지"(다른 atp 패키지가 의존하지 않는 atp 패키지)를 제외한 모든 필터를 필터링하는 코드를 추가했습니다. < askubuntu.com/a/948532/723997 > 게시물"수동으로 실행 한 apt-get 설치 명령의 기록을 어떻게 볼 수 있습니까? " 라는 질문에 대한 답변 입니다.
크레이그 cks 스

1
데비안 / 우분투 : grep " install " /var/log/dpkg.log“상태”줄뿐만 아니라“설치”줄만 나열합니다.
디저트

apt 또는 dpkg 상점 설치 / 수정 날짜 시간이 없다면 2019 년에는 받아 들일 수없는 것 같습니다. 우리는 여전히 컴퓨터에 있거나 없을 수있는 로그 파일을 가져 오는 데 의존합니까? 이것은 어떻게됩니까?
theferrit32

20

Mikel은 dpkg 수준에서이 작업을 수행하는 방법을 보여주었습니다 . 특히, /var/lib/dpkg/info/$packagename.list패키지가 설치 될 때 작성되며 나중에 수정되지 않습니다.

APT 도구를 사용한 경우 (자동으로 수동으로 설치 한 패키지에 대해 우려한 이후에 수행 한 것으로 추정 됨)에 기록이 /var/log/apt/history.log있습니다. 회전하지 않는 한 자동으로 설치된 것으로 표시된 패키지에 대한 주석과 함께 모든 APT 설치, 업그레이드 및 제거를 추적합니다. 이것은 APT 0.7.26에 도입 된 상당히 최근의 기능이므로 데비안에서는 짜서 나타납니다. 우분투에서는 10.04가 history.log있지만 자동으로 설치된 주석은 10.10까지 존재하지 않습니다.


1
Mikel이 지적했듯이 "결국 오래된 /var/log/dpkg.log.* 파일은 로그 회전에 의해 삭제되므로 시스템의 전체 기록을 보장 할 수는 없습니다." 현재 최상위 레벨 패키지를 감지하는 방법에 대해서는 < askubuntu.com/a/948532/723997 > 답변을 참조하십시오 (다른 패키지가없는 패키지 의미)
Craig Hicks

5

거칠지 만 작동합니다.

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; 
    do basename ${fillo} | sed 's/.list$//g' ; 
done > forens.txt

ls -ltr /var/lib/dpkg/info/*.list > forentime.txt

for lint in `cat forens.txt` ; do 
    echo -n "[ ${lint} Installed ] : " ; 
    echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ; 
    ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
        grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ; 
done > pkgdatetime.txt

2
의 출력을 파싱하기위한 히스 ls. 참조 mywiki.wooledge.org/ParsingLs 이 위험한 이유에 메모를 / 본질적으로 버그가 - 안전한 옵션 중 하나를 사용하는 것 find -printf또는 stat --format명확하게 분석 할 수있는 스트림을 생성 할 수 있습니다.
Charles Duffy

@CharlesDuffy Nice 링크이지만 단순성을 위해 사용하는 ls -al --time-style=long-iso것이 도움이되어야합니다. 또한 누군가가 APT 패키지 \n\t\r\v의 이름을 그 이름 으로 사용한다고 들었을 것 입니다.
not2qubit

4

/var/log/apt/history.log파일은 어색한 형식 이럴있다.

시작 날짜 : {date} {time} 명령 줄 : {command} {options ...} 설치 : {package (version)}, ..., {package (version)}, ... End-Date : {date } {시각}

더 많은 로그 파일 형식의 레코드를 선호했을 것입니다.

{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n

또는 {package}뿐만 아니라 {dependencies}를 보여주는 일부 XML.

현재 구현 된대로 원하는 정보를 찾을 수 있지만 세부 정보를 추출하려면 법 의학적 처리가 필요합니다.


3

이것은 데비안 시스템에서 작동합니다. 2011 년 이후 파일 형식이 변경되었다고 생각합니다.이 시스템은 매우 신선하므로 오래된 시스템에서는 작동하지 않을 것입니다.하지만 로그 압축을 풀고 사용해야 할 수도 있습니다. 그들 모두를 지칭하는 글로브.

grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '

파일의 각 줄에서 처음 두 필드 /var/log/dpkg.log는 날짜와 시간입니다. grep 부분에 설치가있는 후미 공간에 주목하십시오. 업그레이드로 인해 설치가 트리거 될 수 있기 때문에 올바르게 이해하면 사용자가 설치 한 내용을 알고 싶었습니다.


1
정확히 내가하는 일 쉬운. 그러나 zgrep을 사용할 수 있으며 모든 .gz 로그는 zgrep 'install'/var/log/dpkg.log*와 같이 검색됩니다. 성가신 "반-설치"를 방지하기 위해 단어 "설치"앞에 공백을 두십시오. 패키지 이름 필드를 얻으려면 cut -f1,5를 사용해야했습니다. 물론 결국 오래된 로그가 회전합니다.
geoO

2

모든 사람들이 원하고 필요로하는 하나의 라이너는 다음과 같습니다.

for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t

결과는 모든 (새로) 설치업그레이드 된 패키지를 시간 순서대로 표시합니다.

라인 설명 :

  • ls -1t-모든 dpkg.log*파일 이름을 시간 순서대로 가져옵니다.
  • zcat -f- 경우 파일입니다 GZIP의 종류 후, 압축을 해제 ELSE 단지 내용에 전달합니다.
  • tac- 출력 역 고양이를 줄 단위는 우리가 올바른 시간 순서를 얻을 확실하게하기 위해.
  • grep- 설치된 또는 업그레이드 패키지 만 확인 하십시오.
  • awk -F ':a'- 아키텍쳐 필드와 패키지 이름을 분리하십시오
  • column -t -열을 공백으로 구분하여 인쇄하십시오.

물론 이것에 대한 별칭을 만들고 싶지만 불행히도 awk 는 작은 따옴표와 큰 따옴표에 의존하기 때문에 불가능 합니다. 이와 관련하여 이것은 bash 스크립트에 가장 :적합 하며 필드 열의 다른 아키텍처 에 대해 구분 기호가 더 잘 처리 됩니다.

출력은 다음과 같습니다.

2018-03-06  18:09:47  upgrade  libgomp1                     :armhf  6.3.0-18+rpi1                 6.3.0-18+rpi1+deb9u1
2018-03-05  15:56:23  install  mpg123                       :armhf  <none>                        1.23.8-1
2018-03-05  15:56:23  install  libout123-0                  :armhf  <none>                        1.23.8-1
2018-01-22  17:09:45  install  libmailtools-perl            :all    <none>                        2.18-1
2018-01-22  17:09:44  install  libnet-smtp-ssl-perl         :all    <none>                        1.04-1

약점:

  • 위에 표시된 것처럼 ARM 아키텍처에서만 작동하며 아키텍처 필드 구분 기호를 약간 수정해야합니다.
  • 별칭을 쉽게 사용하려면 스크립트에 넣어야합니다.
  • 다른 * nix 시스템에서 테스트되지 않았습니다

1

다른 배포 답변을 환영한다고 언급하기 때문에 이것을 주목하십시오. rpm에는 큰 출력 형식 태그 세트가 있으며 그 중 하나는 INSTALLTIME입니다. ( wget예를 들어 사용)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156

몇 가지 방법으로 형식을 지정할 수 있습니다. 나는 이런 식으로 사용합니다 :

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST

이 두 페이지에는 RPM 메타 데이터 문제 해결에 대한 유용한 정보가 많이 있습니다.

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

이 정보를 정렬하면 문제에 대한 효과적인 해결책을 얻을 수 있습니다.


1

GNU / Linux 데비안에는이 문제에 대한 도구가 내장되어 있지 않지만 표준 방식으로 설치된 프로그램에 대한 모든 정보는 / var / lib / dpkg / info / 위치에 program-name.list 파일로 저장됩니다 . 그러나 수동으로 설치된 프로그램에 대한 정보는 없습니다.


긴 한 줄 솔루션 :

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
    stat_result=$(stat --format=%y "$file_list"); \
    printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done

설명 :

  1. ls -rt날짜 수정에 따라 정렬 된 파일을 역순으로 출력합니다. , 목록 끝에 최신 파일이 있습니다.
  2. stat 사람이 읽을 수있는 형식으로 파일 날짜를 인쇄합니다.
  3. printf 패키지 이름과 마지막 수정 날짜를 표시합니다.
  4. for가장 오래된에서 최신에 전체 인쇄 패키지 이름과 날짜로 루프.

출력 예 (잘림) :

.........................................
gnome-system-log                            2016-09-17 16:31:58.000000000 +0300
libyelp0                                    2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor                        2016-09-17 16:32:00.000000000 +0300
yelp-xsl                                    2016-09-17 16:32:01.000000000 +0300
yelp                                        2016-09-17 16:32:03.000000000 +0300
gnome-user-guide                            2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd                        2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86                  2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-amd64                2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common               2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:amd64                        2017-02-26 20:11:21.126184016 +0200
openssl                                     2017-02-26 20:11:22.094098618 +0200
unzip                                       2017-02-26 20:11:23.118013331 +0200
wireless-regdb                              2017-02-26 20:11:23.929949143 +0200
nodejs                                      2017-02-26 20:11:33.321424052 +0200
nasm                                        2017-02-28 16:41:17.013509727 +0200
librecode0:amd64                            2017-03-01 10:38:49.817962640 +0200
libuchardet0                                2017-03-01 10:41:10.860098788 +0200
tree                                        2017-03-04 14:32:12.251787763 +0200
libtar0                                     2017-03-07 09:51:46.609746789 +0200
libtar-dev                                  2017-03-07 09:51:47.129753987 +0200

이 솔루션의 주요 결함은 프로덕션 환경에서 잘 테스트되지 않았다는 것입니다.


이것은 거의 작업을 수행하는 아름다운 솔루션입니다. 단점은 단지 (1) 매우 느리고 (2) 이전 버전이 아닌 패키지가 마지막으로 업데이트 된 시점 만 표시 한다는 입니다. 물론 이것은 one-liner의 문제는 아니지만 dpkg가의 역사를 추적하지 않는 방법입니다 /var/lib/dpkg/info/. 그렇기 때문에 사용 /var/log/dpkg.log*이 바람직 할 수도 있습니다.
not2qubit

1

거칠지 만 다른 솔루션만큼 빠르게 작동합니다. 날짜 형식은 yyyymmddhhmmss입니다. 즉, 비트 또는 재정렬 및 ​​형식 제거 결과 숫자를 정렬 할 수 있습니다.

다른 솔루션 덕분에이 목록에는 빌드 운영 체제를 만드는 데 사용할 수있는 설치 순서대로 패키지 이름이 나열되어 있습니다.

find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; \
| sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' \
| sort | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'

@ alexander-cave에 오신 것을 환영합니다! 사람들이 어떤 종류의 출력을 기대할 수 있도록 몇 줄의 출력을 추가 하십시오.
not2qubit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.