설치 날짜별로 설치된 패키지를 어떻게 나열합니까?
데비안 / 우분투 에서이 작업을 수행해야합니다. 다른 배포판에 대한 답변도 좋습니다.
특정 코드를 컴파일하기 위해 많은 것들을 설치했으며 설치해야 할 패키지 목록을 얻고 싶습니다.
설치 날짜별로 설치된 패키지를 어떻게 나열합니까?
데비안 / 우분투 에서이 작업을 수행해야합니다. 다른 배포판에 대한 답변도 좋습니다.
특정 코드를 컴파일하기 위해 많은 것들을 설치했으며 설치해야 할 패키지 목록을 얻고 싶습니다.
답변:
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
있습니다.
apt-get
이상을 좋아 rpm
하지만 데비안은 데이터베이스에 설치 날짜를 저장하지 않아서 -1을 얻습니다. 데비안 트릭에는 선택한 패키지 뿐만 아니라 설치된 모든 패키지가 포함 되지만 좋은 시작입니다.
half-installed
경우 다음과 같은 경우에 쪼개짐이 줄어 듭니다 ( 항목 제거 ).grep install\ /var/log/dpkg.log
grep " install " /var/log/dpkg.log
“상태”줄뿐만 아니라“설치”줄만 나열합니다.
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까지 존재하지 않습니다.
거칠지 만 작동합니다.
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 이 위험한 이유에 메모를 / 본질적으로 버그가 - 안전한 옵션 중 하나를 사용하는 것 find -printf
또는 stat --format
명확하게 분석 할 수있는 스트림을 생성 할 수 있습니다.
ls -al --time-style=long-iso
것이 도움이되어야합니다. 또한 누군가가 APT 패키지 \n\t\r\v
의 이름을 그 이름 으로 사용한다고 들었을 것 입니다.
/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.
현재 구현 된대로 원하는 정보를 찾을 수 있지만 세부 정보를 추출하려면 법 의학적 처리가 필요합니다.
이것은 데비안 시스템에서 작동합니다. 2011 년 이후 파일 형식이 변경되었다고 생각합니다.이 시스템은 매우 신선하므로 오래된 시스템에서는 작동하지 않을 것입니다.하지만 로그 압축을 풀고 사용해야 할 수도 있습니다. 그들 모두를 지칭하는 글로브.
grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '
파일의 각 줄에서 처음 두 필드 /var/log/dpkg.log
는 날짜와 시간입니다. grep 부분에 설치가있는 후미 공간에 주목하십시오. 업그레이드로 인해 설치가 트리거 될 수 있기 때문에 올바르게 이해하면 사용자가 설치 한 내용을 알고 싶었습니다.
모든 사람들이 원하고 필요로하는 하나의 라이너는 다음과 같습니다.
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
약점:
다른 배포 답변을 환영한다고 언급하기 때문에 이것을 주목하십시오. 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
이 정보를 정렬하면 문제에 대한 효과적인 해결책을 얻을 수 있습니다.
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
설명 :
ls -rt
날짜 수정에 따라 정렬 된 파일을 역순으로 출력합니다. 즉 , 목록 끝에 최신 파일이 있습니다.stat
사람이 읽을 수있는 형식으로 파일 날짜를 인쇄합니다.printf
패키지 이름과 마지막 수정 날짜를 표시합니다.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
이 솔루션의 주요 결함은 프로덕션 환경에서 잘 테스트되지 않았다는 것입니다.
/var/lib/dpkg/info/
. 그렇기 때문에 사용 /var/log/dpkg.log*
이 바람직 할 수도 있습니다.
거칠지 만 다른 솔루션만큼 빠르게 작동합니다. 날짜 형식은 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}'