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

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

설치 날짜별로 설치된 패키지를 나열하는 방법은 무엇입니까?

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

특정 코드를 컴파일하기 위해 많은 것을 설치했는데, 설치해야 하는 패키지 목록을 가져오고 싶습니다.

답변1

RPM 기반 배포(예: Red Hat)는 간단합니다.

rpm -qa --last

Debian 및 기타 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

답변2

Mikel은 dpkg 수준에서 이를 수행하는 방법을 보여주었습니다.. 특히 /var/lib/dpkg/info/$packagename.list패키지가 설치될 때 생성됩니다(이후에는 수정되지 않습니다).

APT 도구를 사용한 적이 있다면(자동으로 설치된 패키지와 수동으로 설치된 패키지에 대해 걱정했기 때문에 사용했을 것입니다) /var/log/apt/history.log회전하지 않는 한 모든 APT 설치, 업그레이드 및 제거하고 자동 설치로 표시된 패키지에 대한 설명을 제공합니다. 이는 APT 0.7.26에 도입된 상당히 새로운 기능이므로 데비안에서는 squeeze로 나타납니다. Ubuntu에는 10.04에 있지만 history.log자동 설치에 대한 참고 사항은 10.10까지 나타나지 않습니다.

답변3

모두가 원하고 필요한 인용문은 다음과 같습니다.

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-만약에파일은보관소입력하신 후 압축을 풀어주세요.기타내용을 전달하면 됩니다.
  • tac- 역방향 출력고양이, 한 줄씩 올바른 시간 순서를 얻을 수 있도록 합니다.
  • grep- 확인만 가능설치됨또는업그레이드가방.
  • awk -F ':a'- 분리된건축학패키지 이름의 필드
  • column -t- 공백으로 구분된 열의 ​​깔끔한 인쇄

물론 이에 대한 별칭을 만들고 싶지만 안타깝게도 이는 불가능합니다.작은따옴표와 큰따옴표에 따라 다릅니다. 이와 관련하여 이것을 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 시스템에서는 테스트되지 않았습니다.

답변4

IMHO /var/log/apt/history.log파일 형식이 어색합니다.

시작 날짜: {날짜} {시간} 명령줄: {command} {옵션...} 설치: {패키지(버전)},..., {패키지(버전)},... 종료 날짜: { 날짜} {시간}

로그 파일 형식으로 로그인하는 것을 선호합니다

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

또는 {package}뿐만 아니라 모든 {종속성}을 표시하는 일부 XML입니다.

현재 구현되어 있기 때문에 필요한 정보를 검색할 수 있지만 세부 정보를 추출하려면 약간의 포렌식 처리가 필요합니다.

관련 정보