나는 쉽게 구문 분석할 수 있는 내 시스템에 저장된 모든 패키지의 저장소를 찾는 좋은 방법을 찾으려고 노력하고 있습니다.
배경 이야기:
나는 Debian wheezy 시스템을 가지고 있고 최신 버전의 패키지를 얻을 수 있도록 wheezy-backports 저장소를 설정했습니다. 고정 구성에서 모드를 잘못 썼는데 눈치채지 못했어요. 백포트 저장소를 수정했습니다 *
. 몇 주 후에 저는 apt-get -y dist-upgrade
눈치채지 못한 채 하나를 출시했고 관심이 있었던 wheeze 백포트로 더 많은 패키지를 업그레이드했습니다.
콘텐츠를 쉽게 복원할 수 있도록 백업이 있지만 이 상황에서는 각 패키지가 어느 저장소에서 왔는지 알아내는 방법을 꼭 찾고 싶습니다.
지금까지 내가 찾은 가장 가까운 방법은 이것이다. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )
. 이것은 약간 가깝지만 이상적으로는 모든 패키지에 대해 이러한 보고서를 얻고 싶습니다.
Package<tab>Version<tab>Origin<tab>Suite
여기서 Origin/Suite는 저장소 릴리스 파일의 값입니다.
답변1
다음 Python 스크립트는 출력을 구문 분석 apt-cache policy
하고 출력 형식으로 설치된 모든 패키지 목록을 생성합니다.
Package<tab>Version<tab>Origin<tab>Suite
적절한-쇼-기원 apt-쇼-기원
#!/usr/bin/env python
# Should be written with python-apt
# but for now parse the output of apt-cache policy
import os
import re
command = "apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )"
stream = os.popen(command);
content = stream.readlines()
getOrigin = False
pkgList = []
#Parse the output generated by apt-cache
for s in content:
if(not s.startswith(' ')):
pkg = type('', (), {})() #Create an empty object
pkg.name = s[:-2] #Remove trailing ':\n'
elif(getOrigin):
pkg.origin = re.split('\s+',s)[2]
pkg.suite = re.split('\s+',s)[3]
pkgList.append(pkg)
getOrigin = False
elif(s.startswith(' ***')):
pkg.version = re.split('\s+',s)[2]
getOrigin = True
#Display the list
for pkg in pkgList:
print pkg.name + '\t'\
+ pkg.version + '\t'\
+ pkg.origin + '\t'\
+ pkg.suite
노트:
- 반대로 댓글에
apt-show-versions
남아있는 내용은 확인해주세요공식 메일링 리스트. 하지만 패키지의 소스를 출력하지 않기 때문에 도움이 되지 않습니다.
답변2
이 질문을 게시한 지 꽤 시간이 지났습니다. 어쨌든 몇 년 전에 시스템에 설치된 추가/오래된/외부 패키지를 찾는 근본적인 문제를 해결하는 도구가 추가되었습니다.
이 명령은 apt-forktracer
소프트웨어 패키지로 제공됩니다. 실행하면 기본적으로 현재 설치된 버전이 아닌 모든 패키지가 표시됩니다.