Проанализируйте имя об/мин в его компоненты

Сервер Hyper-V является встроенным гипервизором без любого графического UI; в этом это очень похоже на установку Ядра Сервера Windows Server 2008, или к серверу ESX VMware.

Можно только сделать управление командной строки от консоли, и гости доступны только удаленно.

Вы правы, если необходимо выполнить VMs и получить доступ к ним от той же консоли сервера, Вам нужна полная установка Windows Server 2008 с ролью Hyper-V.

19
задан 26 November 2013 в 16:09
9 ответов

Мне сказали, что официальный способ делать то, что я ищу, - это Python:

from rpmUtils.miscutils import splitFilename

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

Я написал короткую программу Python, которая делает то, что мне нужно. Я предложу скрипт в проект rpmdev для включения.

14
ответ дан 2 December 2019 в 20:15

Можно использовать dnf info. Вот сценарий Bash в качестве примера, чтобы получить значения и установить как переменная:

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}"

Это даст результат, даже если пакет не будет установлен.

0
ответ дан 2 December 2019 в 20:15

You don't need to do any of this; RPM has a query format argument which will let you specify exactly the data you want to receive. It will even output without line endings if you don't specify them.

For instance:

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

The complete list of variables you can use can be obtained with:

rpm --querytags

Note that in the case of RELEASE, output like 84.el6 is normal and expected, since this is actually how RPM packages are versioned when packaged by or for a distribution.

25
ответ дан 2 December 2019 в 20:15

Я разработал регулярные выражения, которые соответствуют всем данным, с которыми я смог их протестировать. Мне пришлось использовать смесь жадных и нежадных спичек. Тем не менее, вот мои версии на perl и python:

Perl:

#! /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";
}

Python:

#! /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)

Я бы предпочел использовать регулярное выражение из проекта RPM. Тот, который я изобрел выше, должен сделать пока.

3
ответ дан 2 December 2019 в 20:15

Используйте параметры -q --queryformat из rpm, как было сказано ранее, если вы хотите сделать это с неустановленным пакетом, вы можете указать rpm с помощью -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')

поэтому обратите внимание , это неправильная информация об оборотах в минуту, например, 1.fedora на самом деле равно 1.fc10 в оборотах.

1
ответ дан 2 December 2019 в 20:15

Если вы знакомы с регулярными выражениями и / или Perl, это довольно просто.

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

или только регулярное выражение:

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

Если вы разделите его, это:

  • что угодно, кроме дефиса, хотя бы один символ: [^ \ -] + (экранирован, потому что дефис имеет особое значение в группах символов)
  • остановить сопоставление после первого дефиса (а не последнего): [^ \ -] +?
  • добавить это в группу захвата: ([^ \ -] +?)
  • Затем дефис: ([^ \ -] +?) -
  • , затем что-нибудь еще в другой группе захвата (кроме конечного .rpm ): ([^ \ -] +?) - (. *). rpm $ (доллар означает «конец строки»)
  • заключите, чем в практический формат сопоставления: m # ([^ \ -] +?) - (. *). rpm $ #

Готово! Просто поместите обе части в переменные $ 1 и $ 2

Комментарий к первому однострочному запросу:

Я находился в каталоге со многими файлами rpm, отсюда ls .

perl -p эквивалентен;

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

Это объясняет, что мне пришлось поместить нулевую строку в $ _ , чтобы Perl не печатал строку обратно после того, как я извлек и напечатал его на заказ. Обратите внимание, что я мог использовать замены, чтобы избежать этого небольшого «взлома».

0
ответ дан 2 December 2019 в 20:15

Rpm-файлы могут иметь некоторые забавные имена файлов в экстремальных случаях, но обычно вы можете разделить NVR на дефисы. Уловка заключается в том, что часть N (имя) NVR может содержать дефисы и подчеркивания, но в V(версии) и R(версии) гарантированно не будет никаких посторонних дефисов. Поэтому вы можете начать с обрезки части VR для получения имени.

$ 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

Основываясь на этом, вы можете изолировать часть Version and Release.

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

Просто разделите дефис еще раз, чтобы изолировать нужную вам часть. И, очевидно, очистите строки расширения архива и rpm-файла, которые являются заданными. Просто даю вам представление о том, как к этому можно подойти в bash.

1
ответ дан 2 December 2019 в 20:15

ИМХО, самый простой способ оболочки:

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

То есть: перевернуть каждую строку, используя косую черту, вырезать только первую часть ( emanelif ), затем, используя дефис, вырезать все, кроме первых двух части (например, оставьте ESAELER , включая emanelif eth fo tser и NOISREV ) и переверните enil обратно.

В вашем примере файл:

$ 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
$

Чтобы получить другие части, выполните упражнение по чтению cut (1) .

0
ответ дан 2 December 2019 в 20:15

Безусловно, самый простой способ — создать регулярное выражение, которое будет делать одно, работать ;-) Регулярное выражение подстроки на диске.:

s/^(?:\w{1})(?:-?\w+?\S+?-?){1,}?(\d+[\:|\.]\d+\S+)/$1/g

Это регулярное выражение подстроки в Perl!

Пример:

echo  bonnie-++sdsdsœ@@œ=gcc-++++_sded-sdsdsd-fcc-gcc-c++-4.8.5-36.0.1.el7_6.2.x86_64|perl  -pe 's/^(?:\w{1})(?:-?\w+?\S+?-?){1,}?(\d+[\:|\.]\d+\S+)/$1/g'

Вывод: 4.8.5-36.0.1.el7_6.2.x86_64

Так что версия правильная. Регулярное выражение охватывает 99,9% имен пакетов RPM в одной строке ;-)

Краткое объяснение: (?:) Незахватывающая группа (мне не нужна эта часть -> использовать для скорости. Всегда)

\w+: Символы слова (включая _)

? Необязательное совпадение

\S+: символ без пробела

{1,} Не-захват-соответствие всей группе 1 или более

Worx для вас и для меня!

0
ответ дан 2 September 2020 в 10:46

Теги

Похожие вопросы