Как я могу программно сказать, соответствует ли имя файла шаблону шарика оболочки?

Самое главное у Вас не может быть LV, охватывающего два различных VGs.

Кроме того, нет никакого инструмента, чтобы переместить логический том к другой группе объема. Можно сделать это косвенно путем создания LV на целевом VG, деактивации источника LV, копирования необработанного содержания и активации целевого LV. И нет никакого инструмента, чтобы переместить физический том к другой группе объема. Можно сделать это косвенно путем перемещения всех LVs, которые используют PV для другого PVs (с pvmove), затем удаляя PV из старого VG и добавляя его к новому.

Это причины иметь единственный VG.

С другой стороны, если Вы когда-либо запланируете выполнить свою машину только с одним пакетом дисков (возможно, потому что диск на 2 ТБ перестал работать), то это будет легче, если VG будет все еще цел.

При создании LV можно выбрать, какой PVs он идет, но это является более громоздким, чем разрешение этому упасть везде, где он хочет на VG.

Учитывая, что наборы дисков предназначаются для содержания различных типов файлов, я пошел бы для отдельного VGs.

Можно сделать обслуживание немного легче, если когда-нибудь необходимо переставлять VGs вокруг путем разделения каждого диска на несколько PVs. Тем путем у Вас есть шанс освобождения одного из PVs в VG для перемещения его в другой VG. В то время как можно уменьшить PV (для выделения освобожденного места к новому PV в другом VG), это является несколько громоздким.

13
02.09.2018, 14:14
5 ответов

Нет общего решения для этой проблемы. Причина в том, что, в Bash, расширение скоба (т. Е. {pattern1, pattern2, ...} и расширение имени файла (узоры файла aka) считаются отдельными вещами и расширены в разных условиях и в разное время. Вот полный список расширений, которые выполняет Bash:

  • Расширение скобки
  • Расширение Tilde
  • Параметр и переменный расширение
  • Управление командованием
  • Арифметическое расширение
  • Разделение слова
  • Расширение

] Поскольку мы заботимся о подмножестве этих (возможно, Brace, Tilde, Tilde и расширения Pathname), можно использовать определенные шаблоны и механизмы, чтобы ограничить расширение контролируемой моды. Например:

#!/bin/bash
set -f

string=/foo/bar

for pattern in /foo/{*,foo*,bar*,**,**/*}; do
    [[ $string == $pattern ]] && echo "$pattern matches $string"
done

Запуск Этот скрипт генерирует следующий вывод :

/foo/* matches /foo/bar
/foo/bar* matches /foo/bar
/foo/** matches /foo/bar

Это работает, потому что установлено -F отключает расширение урока, поэтому в операторе появляется только расширение расширения скобки и расширение тильды для шаблона в / foo / {*, foo *, bar *, * *, ** / *} . Затем мы можем использовать тестовую операцию [[$ String == $ Pattern ]] Для тестирования распространения на расширении пути после расширения скобки уже выполнено расширение.

8
27.01.2020, 19:53

в zsh:

[[ $string = $~pattern ]] && print true
-2
27.01.2020, 19:53

я не полагаю, что {панель, baz} образец шарика оболочки (хотя, конечно /foo/ba [с пассивной паузой] ) , но если вы хотите знать, можно ли $string соответствия $pattern сделать:

case "$string" in 
($pattern) put your successful execution statement here;;
(*)        this is where your failure case should be   ;;
esac

можно сделать столько, сколько хотите:

case "$string" in
($pattern1) do something;;
($pattern2) do differently;;
(*)         still no match;;
esac
7
27.01.2020, 19:53

я использовал бы grep таким образом:

#!/bin/bash
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"

if echo $string | grep -e "$pattern1" > /dev/null; then
    echo $string matches $pattern1
fi

if echo $string | grep -e "$pattern2" > /dev/null; then
    echo $string matches $pattern2
fi

, Который дает вывод:

./test2.bsh 
/foo/bar matches /foo/*
1
27.01.2020, 19:53

Как отметил Патрик, вам нужен «другой тип» шаблона:

[[ /foo/bar == /foo/@(bar|baz) ]]


string="/foo/bar"
pattern="/foo/@(bar|baz)"
[[ $string == $pattern ]]

там нет необходимости.

3
27.01.2020, 19:53

Теги

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