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

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

debian / ubuntu에서이 작업을 수행해야합니다. 다른 배포판에 대한 답변도 좋을 것입니다.

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

댓글

답변

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

rpm -qa --last 

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

grep install /var/log/dpkg.log 

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

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

일반적으로 dpkgapt는 설치 날짜를 추적하지 않는 것 같습니다. dpkg-query 매뉴얼 페이지.

그리고 결국 오래된 /var/log/dpkg.log.* 파일은 로그 회전에 의해 삭제되므로 그렇게되지 않습니다. ” t는 시스템의 전체 기록을 보장합니다.

몇 번 나타나는 제안 사항 (예 : 이 스레드 )는 /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 명령이 더 효율적입니다.

댓글

  • 저는 보통 iv id =보다 apt-get를 더 좋아합니다. “56b96ca800”>

,하지만 이제 데비안은 데이터베이스에 설치 날짜를 저장하지 않아 -1을 얻습니다. 데비안 트릭에는 선택한 패키지뿐만 아니라 설치된 모든 패키지가 포함되지만 ‘ 좋은 시작입니다.

  • Debian의 경우 다음과 같이하면 덜 복잡해집니다 (half-installed 항목 제거). grep install\ /var/log/dpkg.log
  • @Mikel-좋은 대답입니다. ‘ gather /var/lib/dpkg/info/*.list 파일 정보 ‘를 확장하고 모든 항목을 필터링하는 코드를 추가했습니다. 그러나 ” 최상위 패키지 ” (다른 atp 패키지가 의존하지 않는 atp 패키지). 해당 < askubuntu.com/a/948532/723997 > 게시물 ” 수동으로 실행 한 apt-get 설치 명령의 기록을 어떻게 볼 수 있습니까? “.
  • Debian / Ubuntu : grep " install " /var/log/dpkg.log는 상태항목도 표시하지 않고 설치항목 만 나열합니다.
  • apt 또는 dpkg 저장소가 설치 / 수정 된 날짜 시간을 저장하지 않는 경우 2019 년에는 꽤 받아 들일 수없는 것 같습니다. 우리는 여전히 머신에있을 수도 있고 없을 수도있는 grepping 로그 파일에 의존하고 있습니까? 어떻게 된 건가요?
  • 답변

    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까지 표시되지 않습니다.

    댓글

    • As Mikel은 다음과 같이 지적했습니다. ” 그리고 결국 오래된 /var/log/dpkg.log.* 파일은 로그 회전에 의해 삭제되므로 그렇게되지 않습니다. ‘ 시스템의 전체 기록을 보장하지는 않습니다. “. < askubuntu.com/a/948532/723997 > 현재 최상위 패키지 (다른 패키지가 의존하지 않는 패키지를 의미)를 감지하는 방법에 대한 답변

    답변

    거칠지 만 작동합니다.

    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 

    댓글

    • 부, 출력을 파싱하기위한 히스 ls. 이것이 위험하거나 본질적으로 버그가있는 이유에 대한 메모는 mywiki.wooledge.org/ParsingLs 를 참조하세요. 더 안전한 옵션은 또는 stat --format를 사용하여 명확하게 구문 분석 할 수있는 스트림을 생성합니다.
    • @CharlesDuffy 멋진 링크이지만 간단하게

      가 도움이 될 것입니다. 또한 누군가가 이름에 \n\t\r\v를 사용하여 APT 패키지의 이름을 지정한다는 것은 들어 본 적이 없을 것입니다.

    Answer

    모두가 원하고 필요로하는 한 줄짜리 글입니다.

     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 cat 의 역 출력 , 정확한 연대순을 얻을 수 있도록 한 줄씩 확인합니다.
    • grep 설치됨 또는 업그레이드 패키지.
    • awk -F ":a"-패키지 이름에서 architecture 필드를 분리합니다.
    • 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 

    Drawback :

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

    답변

    /var/log/apt/history.log 파일의 형식이 IMHO 이상입니다.

    시작일 : {date} {time } 명령 줄 : {command} {options …} 설치 : {package (version)}, …, {package (version)}, … End-Date : {date} {time}

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

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

    또는 { package} 그러나 모든 {dependencies}.

    현재 구현 된대로 원하는 정보를 발견하지만 세부 정보를 추출하려면 포렌식 처리가 필요합니다.

    Answer

    데비안 시스템에서 파일 형식이 2011 년 이후로 변경된 것 같습니다.이 시스템은 매우 신선하므로 이전 시스템에서 작동 할 것으로 예상하지 않습니다. 로그 압축을 풀고 전체를 참조하기 위해 glob을 사용해야 할 수도 있습니다.

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

    /var/log/dpkg.log 파일의 각 줄에있는 처음 두 필드는 날짜와 시간입니다. grep 부분에서 install의 후행 공간에 유의하십시오. 이는 업그레이드가 설치를 트리거 할 수 있기 때문입니다.하지만 올바르게 이해했다면 사용자가 무엇을 설치했는지 알고 싶었습니다.

    댓글

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

    답변

    GNU / Linux 데비안에는 내장 도구가 없습니다. 그러나 표준 방식 에 설치된 프로그램에 대한 모든 정보는 program-name. / var / lib / dpkg / info / 위치에있는 목록 . 하지만 수동으로 설치된 프로그램에 대한 정보는 없습니다.


    긴 한 줄 솔루션 :

    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) 다음 경우에만 표시된다는 것입니다. 패키지가 마지막으로 업데이트되었으며 이전 버전은 ‘ 없습니다. 물론 이것은 한 줄짜리 문제가 아니지만 dpkg가 ‘ /var/lib/dpkg/info/에서 기록을 추적하지 않는 방식입니다. 그렇기 때문에 /var/log/dpkg.log*를 사용하는 것이 좋습니다.

    답변

    다른 배포 답변을 환영한다고 언급했기 때문에 이것을 주목하십시오. 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

    이 정보를 정렬하면 문제에 대한 작업 솔루션을 얻을 수 있습니다.

    답변

    거칠지 만 다른 솔루션만큼 빠르게 작동합니다. 날짜 형식은 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를 환영합니다! 사람들이 어떤 종류의 출력을 기대하는지 알 수 있도록 몇 줄의 출력 을 추가하세요.

    답변

    Aapt의 회전 된 로그 파일을 사용하면 다음을 수행 할 수 있습니다.

    zcat -f /var/log/dpkg.log* | grep " install " | less 

    답변

    쿠분투에서 다음 명령을 사용하여 달성했습니다.

    1. 패키지 나열
    2. 모든 표준 입력을 읽습니다.
    3. 전체를 저장합니다. ” % n | % y ” 형식의 경로 (경로 | 만든 날짜)를 변수로 변환합니다.
    4. 파일 이름을 변수에 저장
    5. 이전 명령이 모두 성공적으로 실행되면 값이 한 줄에 인쇄됩니다.
    ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

    감사합니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다