কোনও RPM নামটির উপাদানগুলিতে পার্স করুন


19

এমন কোনও নাম-পার্সিং সরঞ্জাম রয়েছে যা অফিসিয়াল আরপিএম সরঞ্জাম প্যাকেজের অংশ?

আমার কাছে ফাইলের নামের একটি তালিকা রয়েছে। প্রতিটি হ'ল একটি RPM প্যাকেজের ফাইল নাম। আমার কাছে আসল প্যাকেজ নেই, কেবলমাত্র ফাইলের নাম। প্রত্যেকের জন্য আমার প্যাকেজের নাম এবং সংস্করণটি বের করতে হবে ($ NAME এবং ERS সংস্করণ)। আমার এটির কারণটি হ'ল আমি এমন একটি স্ক্রিপ্ট লিখছি যা তখন নিশ্চিত হয়ে যায় যে "ইয়াম ইনস্টল $ সংস্করণ" ইনস্টল করে $ সংস্করণ। এটি এমন একটি সিস্টেমের অংশ যা প্যাকেজগুলি তৈরি করে এবং সেগুলি সঠিকভাবে আপলোড করা হয়েছে তা যাচাই করে।

ফাইলের নামের তালিকাটি দেখে মনে হচ্ছে:

$ cat /tmp/packages.txt
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-el-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-hgk-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/python-redis-2.8.0-2.el6.noarch.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/redis-2.6.16-1.el6.1.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm

আমি নিম্নলিখিত কোডটি পেয়েছি যা একটি বেস ফাংশন যা কাজটি করে:

function parse_rpm() { RPM=$1;B=${RPM##*/};B=${B%.rpm};A=${B##*.};B=${B%.*};R=${B##*-};B=${B%-*};V=${B##*-};B=${B%-*};N=$B;echo "$N $V $R $A"; }

for i in $(</tmp/packages.txt) ; do
    parse_rpm $i
done

এটা কাজ করে। অধিকাংশ ক্ষেত্রে. কিছু ব্যতিক্রম আছে:

$ parse_rpm CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm
sei_dnsmaster 1.0 99.el6 x86_64

লক্ষ্য করুন যে এটি সংস্করণটি সঠিকভাবে পায় নি (এটি 1.0-99 হওয়া উচিত)

আমি ভাবছি (1) আরপিএমদেব প্যাকেজে কোনও সরঞ্জাম আছে যা এটি সঠিকভাবে করে। (২) যদি না হয়, তবে আমি ব্যবহার করতে পারি এমন কোনও অফিসিয়াল রেজেেক্স রয়েছে কি? (3) সেই রেজেক্সের অজগর সমতুল্য কী?

আগাম ধন্যবাদ!


আপনি নিজের ইনপুটটি কোথা থেকে পাচ্ছেন এবং এটি যে বিন্যাসে লাগে তা স্পষ্ট করে বলতে পারেন।
ব্যবহারকারী 9517 GoFundMonica

উত্তর:


25

আপনার এগুলির কোনও কিছুই করার দরকার নেই; আরপিএমের একটি ক্যোয়ারী ফর্ম্যাট যুক্তি রয়েছে যা আপনাকে ঠিক যে ডেটা পেতে চাইবে তা নির্দিষ্ট করতে দেয়। এমনকি যদি আপনি সেগুলি নির্দিষ্ট না করেন তবে লাইন শেষ না করেও আউটপুট আসবে।

এই ক্ষেত্রে:

rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q coreutils
rpm --queryformat "The version of %{NAME} is %{VERSION}\n" -q coreutils

rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -qp file.rpm

আপনি ব্যবহার করতে পারেন ভেরিয়েবলের সম্পূর্ণ তালিকা এর সাথে পাওয়া যাবে:

rpm --querytags

মনে রাখবেন যে ক্ষেত্রে যেমন RELEASEআউটপুটটি 84.el6স্বাভাবিক এবং প্রত্যাশিত হয়, যেহেতু আরপিএম প্যাকেজগুলি যখন কোনও ডিস্ট্রিবিউশনের মাধ্যমে বা প্যাকেজ করা হয় তখন এটি কীভাবে রূপান্তরিত হয়।


2
এটি কেবল ইনস্টলড প্যাকেজগুলির সাথেই কাজ করে। আমি ফাইলের নামগুলি পরিচালনা করতে চাই। $ rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q CentOS/6/x86_64/sei_dnsmaster-1.0-84.el6.x86_64.rpm package CentOS/6/x86_64/sei_dnsmaster-1.0-84.el6.x86_64.rpm is not installed
টমঅনটাইম

@ টমঅনটাইম এক মিনিট অপেক্ষা করুন ... সুতরাং প্যাকেজে আসলে কী তা আপনি চিন্তা করছেন না?
মাইকেল হ্যাম্পটন

4
আমি আশা করি আমি তাড়াতাড়ি জানতে পারতাম। আরপিএম সরঞ্জামগুলি কেবল প্যাকেজের বিষয়বস্তু নিয়ে কাজ করে; ফাইলের নামটি সম্পূর্ণ অপ্রাসঙ্গিক (এবং এই উত্তরটি আপনার পক্ষে কার্যকর হবে না)।
মাইকেল হ্যাম্পটন

1
libopenssl0_9_8-32bit-0.9.8j-0.26.1_0.50.1.x86_64.delta.rpm
পার্সিংয়ের

5
@ টমঅনটাইম - "এটি কেবল ইনস্টলড প্যাকেজগুলির সাথেই কাজ করে" সত্য নয় - আপনি তৃতীয় উদাহরণে -p বিকল্পটি মিস করেছেন: rpm --queryformat "% {NAME}% {সংস্করণ%% রিলিজ}% {আর্ক {" -কিপি ফাইল .rpm
স্যাম এলস্টব

14

পাইথনে যা চাইছি তা করার জন্য আমাকে অফিসিয়াল পদ্ধতিতে বলা হয়েছে:

from rpmUtils.miscutils import splitFilename

(n, v, r, e, a) = splitFilename(filename)

আমি একটি সংক্ষিপ্ত পাইথন প্রোগ্রাম লিখেছি যা আমার প্রয়োজন অনুযায়ী করে does আমি অন্তর্ভুক্তির জন্য আরপিএমদেব প্রকল্পের স্ক্রিপ্টটি অফার করব।


1
দেবিয়ান প্যাকেজ নামকরণের নিয়মগুলি এত সহজ এবং স্ট্র্যাচটওয়ারওয়ার্ড - জানি না কীভাবে এই জাতীয় গোলযোগের মধ্যে আরপিএমের বিশ্ব শেষ হয়েছে। আপনি এখানে স্ক্রিপ্ট উত্তরের পেস্ট করতে পারেন?
পল হেদারলি

3

আমি নিয়মিত ভাব প্রকাশ করেছি যা আমি তাদের যাচাই করতে সক্ষম হয়েছি এমন সমস্ত ডেটা ফিট করে। আমাকে লোভী এবং অ-লোভী মিলগুলির মিশ্রণটি ব্যবহার করতে হয়েছিল। এটি বলেছিল, এখানে আমার পার্ল এবং অজগর সংস্করণ রয়েছে:

পার্ল:

#! /usr/bin/perl

foreach (@ARGV) {
    ($path, $name, $version, $release, $platform,
      @junk) = m#(.*/)*(.*)-(.*)-(.*?)\.(.*)(\.rpm)#;
    $verrel = $version . '-' . $release;

    print join("\t", $path, $name, $verrel, $version, $rev, $platform), "\n";
}

পাইথন:

#! /usr/bin/python

import sys
import re

for x in sys.argv[1:]:
    m = re.search(r'(.*/)*(.*)-(.*)-(.*?)\.(.*)(\.rpm)', x)
    if m:
        (path, name, version, release, platform, _) = m.groups()
        path = path or ''
        verrel = version + '-' + release
        print "\t".join([path, name, verrel, version, release, platform])
    else:
        sys.stderr.write('ERROR: Invalid name: %s\n' % x)
        sys.exit(1)

আমি বরং একটি রেইজেক্স চাই যা আরপিএম প্রকল্প থেকে আসে। আমি উপরে যেটি আবিষ্কার করেছিলাম তা এখনই করতে হবে।


এটি আমার সমাধানের তুলনায় বেশিরভাগই সমান ( .*তবে আপনি সত্যিই কোনও কিছুর সাথে মেলে না চাইলে এড়িয়ে চলুন )। আপনি নিজেই পেয়েছেন দেখে ভাল লাগল!
mveroone

2
ফাইলের নামটি আমাকে এই তথ্য পাওয়ার খারাপ উপায় হিসাবে আঘাত করে। এটি বিক্রেতার দ্বারা সরবরাহিত আরপিএমগুলির নির্দিষ্ট সেটগুলির জন্য কাজ করতে পারে (যতক্ষণ না আপনার বিক্রেতা তৃতীয় পক্ষের উপাদানগুলিকে মানিকরণ করেন এবং তাদের নামকরণের ফর্ম্যাটটি কখনও পরিবর্তন করেন না) তবে আমি প্রচুর সৃজনশীল-নামযুক্ত আরপিএম ফাইল দেখেছি। অ্যাক্রোব্যাট রিডারটি আমি কয়েক সেকেন্ড আগে অ্যাডোব থেকে AdbeRdr9.5.5-1_i486linux_enu.rpmধরেছিলাম যেটি হ'ল উপরে আপনার রেজেক্স পার্সিংটি।
voretaq7

সত্য। তবে অ্যাডবে কোনও সমাধানের জন্য কাজ করবে না কারণ এটি yum ফাইলের নামটি ভেঙে দেয়। (প্রযুক্তিগতভাবে প্রশ্নটি ইউএম ফাইলের নামগুলি সম্পর্কে হওয়া উচিত, আরপিএম ফাইলের নাম নয়)।
টমঅনটাইম

1

আরএমপি ফাইলগুলিতে চরম ক্ষেত্রে কিছু মজাদার ফাইলের নাম থাকতে পারে তবে সাধারণত আপনি হাইফেনগুলিতে এনভিআর বিভক্ত করতে পারেন। ক্যাচটি এনভিআর এর এন (নাম) অংশে হাইফেন এবং আন্ডারস্কোর থাকতে পারে তবে ভি (সংস্করণ) এবং আর (প্রকাশ) কোনও বহিরাগত হাইফেন না থাকার গ্যারান্টিযুক্ত। সুতরাং আপনি নাম নেওয়ার জন্য ভিআর অংশটি ছাঁটাই করে শুরু করতে পারেন।

$ RPM=/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-2.8-3.el6.x86_64.rpm
$ echo ${RPM%-*-*}
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial

এর উপর ভিত্তি করে আপনি সংস্করণ এবং প্রকাশের অংশটি আলাদা করতে পারেন।

echo ${RPM#${RPM%-*-*}-*}
2.8-3.el6.x86_64.rpm

আপনার প্রয়োজনীয় অংশটি আলাদা করতে কেবল হাইফেনকে আবার বিভক্ত করুন। এবং স্পষ্টতই খিলান এবং আরপিএম ফাইল এক্সটেনশন স্ট্রিংগুলি পরিষ্কার করুন, যা প্রদত্ত। এটি আপনাকে কীভাবে ব্যাশে যেতে পারে সে সম্পর্কে একটি ধারণা প্রদান করে।


1

আরপিএম থেকে -Q --queryformat বিকল্পগুলি আগে যেমন বলেছিল ব্যবহার করুন, আপনি যদি ইনস্টল না করা প্যাকেজটিতে এটি করতে -pচান তবে এই বিকল্পটির সাথে আরপিএম নির্দিষ্ট করতে পারেন :

rpm -q -p ./Downloads/polysh-0.4-1.noarch.rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n"
polysh 0.4 1 noarch

যেমন

$ ls ./Downloads/*.rpm
./Downloads/adobe-release-x86_64-1.0-1.noarch.rpm
./Downloads/nautilus-dropbox-1.6.0-1.fedora.x86_64.rpm
./Downloads/playonlinux-yum-4-1.noarch.rpm
./Downloads/skype-4.2.0.11-fedora.i586.rpm
./Downloads/dbview-1.0.4-2.1.x86_64.rpm
./Downloads/openmotif22-libs-2.2.4-192.1.3.x86_64.rpm
./Downloads/polysh-0.4-1.noarch.rpm

আমাকে দেয়

adobe-release-x86_64 1.0 1 noarch
dbview 1.0.4 2.1 x86_64
nautilus-dropbox 1.6.0 1.fc10 x86_64
openmotif22-libs 2.2.4 192.1.3 x86_64
playonlinux-yum 4 1 noarch
polysh 0.4 1 noarch
skype 4.2.0.11 fc16 i586

তাই শুধু ফাইলের নাম বিভক্ত করা ভুল!

for filename in """<paste list here>""".split():
    print splitFilename(filename)

('./Downloads/adobe-release-x86_64', '1.0', '1', '', 'noarch')
('./Downloads/nautilus-dropbox', '1.6.0', '1.fedora', '', 'x86_64')
('./Downloads/playonlinux-yum', '4', '1', '', 'noarch')
('./Downloads/skype', '4.2.0.11', 'fedora', '', 'i586')
('./Downloads/dbview', '1.0.4', '2.1', '', 'x86_64')
('./Downloads/openmotif22-libs', '2.2.4', '192.1.3', '', 'x86_64')
('./Downloads/polysh', '0.4', '1', '', 'noarch')

তাই বেতন মনোযোগ , এই RPM সঠিক বিবরণ নয়, যেমন 1.fedoraআসলে 1.fc10RPM হবে।


আমি বিভ্রান্তি দেখছি। কেবল আরপিএম ইনস্টলডই নয়, আমার কাছে এই মেশিনে নেই। আমি প্যাকেজ এবং ফাইলের নামের তালিকা প্রক্রিয়া করছি। এটি এমন কোনও কিছুর জন্য যা রেপো ইভেন্টগুলি পরিচালনা করে; এটিতে আসল প্যাকেজ নেই।
টমঅনটাইম

0

আপনি যদি নিয়মিত এক্সপ্রেশন এবং / অথবা পার্লের সাথে পরিচিত হন তবে তা বেশ সহজ।

 ls | head | perl -p -e 'm#([^\-]+?)-(.*).rpm$#; print "$1 $2\n";$_=""' 

বা একাকী রেজেক্স:

m#([^\-]+?)-(.*).rpm$#

আপনি যদি এটি বিভক্ত যে এটি:

  • হাইফেন ছাড়া অন্য কিছু, কমপক্ষে একটি চরিত্র: [^\-]+(পালিয়ে গেছে কারণ চরিত্রের গ্রুপগুলিতে হাইফেনের একটি বিশেষ অর্থ রয়েছে)
  • প্রথম হাইফেনের পরে ম্যাচটি থামান (এবং শেষ নয়): [^\-]+?
  • এটি একটি ক্যাপচার গ্রুপে যুক্ত করুন: ([^\-]+?)
  • তারপরে একটি হাইফেন: ([^\-]+?)-
  • তারপরে অন্য ক্যাপচার গ্রুপে অন্য কিছু (তবে পিছনে .rpm): ([^\-]+?)-(.*).rpm$ (ডলারের অর্থ "লাইনের শেষ")
  • ব্যবহারিক মিলের বিন্যাসের চেয়ে ঘের: m#([^\-]+?)-(.*).rpm$#

সম্পন্ন ! শুধু ভেরিয়েবল $1এবং উভয় অংশ পেতে$2

প্রথম ওয়ানলাইনার সম্পর্কে মন্তব্য:

আমি অনেকগুলি আরপিএম ফাইল সহ একটি ডিরেক্টরিতে ছিলাম, তাই ls

perl -p সমান;

perl -e 'while(<STDIN>){ chomp($_);  [YOUR CODE HERE] ; print($_); }' 

যা ব্যাখ্যা করে যে আমি $_এটি উত্তোলন এবং কাস্টম-মুদ্রণ করার পরে লাইনটি পেরিল মুদ্রণ এড়ানোর জন্য আমাকে একটি নাল-স্ট্রিং লাগাতে হয়েছিল । দ্রষ্টব্য যে আমি এই ছোট 'হ্যাক' এড করতে বিকল্প ব্যবহার করতে পারতাম।


এটি শত শত আরপিএম নামের উপর মোটেও কাজ করে না, যেমন module-init-tools-3.9-21.el6_4.x86_64.rpm
নিমো

0

আইএমএইচও সহজ শেল উপায় হ'ল:

ls | rev | cut -d/ -f1 | cut -d- -f3- | rev

এটি হ'ল: প্রতিটি লাইনকে বিপরীত করুন, স্ল্যাশ কাটা মাত্র প্রথম অংশ ( ইমানেলিফ ) ব্যবহার করে, তারপর হাইফেন ব্যবহার করে প্রথম দুটি অংশ বাদে (অর্থাত্ ESAELER এর পেছনে ছেড়ে দিন Emanelif Eth fser এবং NOISREV সহ ) এবং পুনরুদ্ধারটিকে বিপরীত করুন ।

আপনার উদাহরণ ফাইল সহ:

$ cat /tmp/packages.txt | rev | cut -d/ -f1 | cut -d- -f3- | rev
emacs-mercurial
emacs-mercurial-el
mercurial
mercurial-hgk
python-redis
redis
sei_dnsmaster
$

অন্যান্য অংশ পেতে রিড কাট (1) এর অংশবিশেষ


0

আপনি ব্যবহার করতে পারেন dnf info। মানগুলি পেতে এবং ভেরিয়েবল হিসাবে সেট করার জন্য এখানে বাশ স্ক্রিপ্টের একটি উদাহরণ রয়েছে:

function dnfinfo() {
   dnf info "$(echo "${1}" | sed 's/\.rpm$//g')"
}

function splitname() {
   eval $(
     dnfinfo "${1}" | \
     grep "^Arch\|^Name\|^Release\|^Version" | \
     sort | \
     awk -F": " {'print "\""$2"\""'} | \
     tr "\n" " " | \
     awk {'print "xarch="$1"~xname="$2"~xrel="$3"~xver="$4'} | \
     tr "~" "\n"
   )
}

splitname "tcpdump-4.9.2-5.el8.x86_64.rpm"
echo "${xname} ${xver} ${xrel} ${xarch}"

এটি প্যাকেজ ইনস্টল না করা হলেও একটি ফলাফল দেবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.