설치 날짜별로 설치된 패키지를 나열하려면 어떻게해야합니까?
debian / ubuntu에서이 작업을 수행해야합니다. 다른 배포판에 대한 답변도 좋을 것입니다.
특정 코드를 컴파일하기 위해 많은 것을 설치했으며 설치해야하는 패키지 목록을 얻고 싶습니다.
댓글
- apt-get 설치 기록을 가져 오는 방법 도 참조하세요.
- ” 적절한 출시일 “을 검색 중이었습니다.이 댓글이 향후 Google 직원에게 도움이 될 수도 있습니다.
- askubuntu.com의 유사한 질문 ” 설치된 모든 패키지를 나열하는 방법 ” .
답변
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
일반적으로 dpkg
및 apt
는 설치 날짜를 추적하지 않는 것 같습니다. 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을 얻습니다. 데비안 트릭에는 선택한 패키지뿐만 아니라 설치된 모든 패키지가 포함되지만 ‘ 좋은 시작입니다.
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까지 표시되지 않습니다.
댓글
- 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
설명 :
-
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
이 솔루션의 주요 결함은 그렇지 않다는 것입니다. 제품에서 잘 테스트 이온.
댓글
- 작업을 거의 완료 할 수있는 멋진 솔루션입니다. ‘의 유일한 단점은 (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
답변
쿠분투에서 다음 명령을 사용하여 달성했습니다.
- 패키지 나열
- 모든 표준 입력을 읽습니다.
- 전체를 저장합니다. ” % n | % y ” 형식의 경로 (경로 | 만든 날짜)를 변수로 변환합니다.
- 파일 이름을 변수에 저장
- 이전 명령이 모두 성공적으로 실행되면 값이 한 줄에 인쇄됩니다.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
감사합니다.