要求定義/目的: 複数バージョンが混在する、又はシェルのワイルドカード展開で取得できない大量(数千個)の 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