読者です 読者をやめる 読者になる 読者になる

RPM ファイルからパッケージ名のみを取得

python 1liner

要求定義/目的: 複数バージョンが混在する、又はシェルのワイルドカード展開で取得できない大量(数千個)の RPM ファイルが置かれたディレクトリからユニークなパッケージ名のみを取得したい
自己アピール: rpm コマンドで個々に取得するよりパフォーマンスが良い
コメント: rsplit を使えばきれいに書けた、こういう処理は awk が得意?

  • pkgs ディレクトリ配下にある RPM ファイルからパッケージ名のみを取得
$ ls pkgs/ | head
automake-1.4p5-4.noarch.rpm
automake-1.6.3-5.noarch.rpm
automake15-1.5-2.noarch.rpm
automake15-1.5-7.noarch.rpm
cups-1.1.17-13.3.46.1AX.i386.rpm
cups-1.1.17-13.3.51.1AX.i386.rpm
cups-devel-1.1.17-13.3.46.1AX.i386.rpm
cups-devel-1.1.17-13.3.51.1AX.i386.rpm
cups-libs-1.1.17-13.3.46.1AX.i386.rpm
cups-libs-1.1.17-13.3.51.1AX.i386.rpm

$ ls pkgs/*.rpm | wc -l
73

$ time (rpm -qp --qf "%{name} " --nosignature ./pkgs/*.rpm | sort -u)
automake automake automake15 automake15 cups cups cups-devel cups-devel
(snip)
tcl tcl-devel tcl-html tcllib tclx tix tk tk-devel tzdata unzip

real    0m1.008s
user    0m0.870s
sys     0m0.070s

$ time python -c 'import sys; flist=sys.argv; print sorted(set([fname[:fname[:fname.rfind("-")].rfind("-")] for fname in flist if fname[-4:] == ".rpm"]))' $(ls pkgs/)
['automake', 'automake15', 'cups', 'cups-devel', 'cups-libs', 'e2fsprogs',
(snip)
'tk-devel', 'tzdata', 'unzip']

real    0m0.108s
user    0m0.087s
sys     0m0.019s

$ time (ls pkgs/ | awk '{n=split($1,a,"-"); sub("-"a[(n-1)]"-"a[n],"",$1); print $0}' | sort -u)
automake
automake15
(snip)
tzdata
unzip

real    0m0.078s
user    0m0.053s
sys     0m0.012s

2008/04/03 追記 : この方が簡潔、けれどパフォーマンスは変わらずか
$ time python -c 'import sys; flist=sys.argv; print sorted(set([fname.rsplit("-",2)[0] for fname in flist if fname[-4:] == ".rpm"]))' $(ls pkgs/)
['automake', 'automake15', 'cups', 'cups-devel', 'cups-libs', 'e2fsprogs',
(snip)
'tk-devel', 'tzdata', 'unzip']

real    0m0.107s
user    0m0.084s
sys     0m0.022s
広告を非表示にする