[Linux]

沢山の RPM からバージョン違いの重複を探す / 2007-03-06 (火)

まぁ、表題の通りなのですが。

沢山の RPM が一つのフォルダに固まって入ってて、そこからソフトウェアごと最新の RPM だけを拾いだしたい、古い RPM を処分して容量を確保したくなったのです。ちょっとさがしたけどちょうどいいソフトがなかったので、rpm-python の API 使って自作してみました。

#!/usr/bin/python
import rpm
import re
import sys,os

if len( sys.argv ) < 1 : 
    rpmdir=sys.argv[1]
else:
    rpmdir="."

rpmdict    = {} ;
rpmnewests = {} ;
ts = rpm.TransactionSet()
ts.setVSFlags( rpm.RPMVSF_NORSA | rpm.RPMVSF_NODSA )
suffix = re.compile( '.*\.rpm$' )
for f in os.listdir( "." ) :
    if suffix.match( f ) :
        fp = os.open( f, os.O_RDONLY )
        hdr = ts.hdrFromFdno( fp )
        os.close( fp )
        if rpmdict.has_key( hdr[ rpm.RPMTAG_NAME ] ) :
            nlist = rpmdict[ hdr[ rpm.RPMTAG_NAME ] ]
        else:
            nlist = []
            rpmdict[ hdr[ rpm.RPMTAG_NAME ] ] = nlist
        info = {}
        info[ 'file' ] = f
        info[ 'hdr' ] = hdr
        nlist.append( info )
        if rpmnewests.has_key( hdr[ rpm.RPMTAG_NAME ] ) :
            ninfo = rpmnewests[ hdr[ rpm.RPMTAG_NAME ] ]
            res = rpm.versionCompare( ninfo['hdr'], info['hdr'] ) 
            if res == 0:
                print "res is zero"
                res = cmp( ninfo['hdr'][rpm.RPMTAG_RELEASE], info['hdr'][rpm.RPMTAG_RELEASE] ) 
            if res < 0 :
                 rpmnewests[ hdr[ rpm.RPMTAG_NAME ] ] = info
        else:
            rpmnewests[ hdr[ rpm.RPMTAG_NAME ] ] = info

for k in rpmdict :
    print k," : ", rpmnewests[ k ][ 'file' ]
    for l in rpmdict[ k ] :
        print "    ", l[ 'file' ]

こんなかんじ

この記事のリンク元 | 530 | 60 | 30 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 15 | 10 | 10 |

この記事のリンク用URL&トラックバックURL : http://x.nest.jp/Linux/070306_0019.htm

...