RAID не имеет никакого отношения к LVM, это два различных понятия, и в различных целях.
Для создания раздела можно сделать это во время инструкции по установке (часть раздела), никакая потребность к команде выполнения вручную.
Прочитайте руководство здесь, и ссылки выше должны получить Вас основные идеи разделить.
Если вы можете использовать perl
:
$ perl -e 'print sprintf "%020s\n","shortstring"'
000000000shortstring
Для более общих целей:
$ perl -e 'print sprintf "%020s\n",shift' shortstring
000000000shortstring
$ perl -e 'print sprintf "%020s\n", $_ for @ARGV' shortstring qwerty
000000000shortstring
00000000000000qwerty
Примечание
Некоторые платформы могут быть сформированы выходной строкой с ведущим нулем, по крайней мере, в AIX
. С помощью GNU gcc
вы получите предупреждение при компиляции:
$ cat test.c
#include <stdio.h>
int main() {
printf("%08s\n", "qwerty");
return 0;
}
Затем:
$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:4:5: warning: '0' flag used with ‘%s’ gnu_printf format [-Wformat]
Если вы не хотите использовать perl
, вы можете попробовать:
$ line=shortstring
$ printf "%0$((20-${#line}))d%s" 0 $line
000000000shortstring
Этот подход не работает, когда длина строки больше 20. Вы можете использовать ответ @mikeserv для обработки этого или воспользоваться проверкой перед printf
.
Отдельная printf
при необходимости может делать набивку 0
с помощью %0Xd
.
zero_pad(){
# zero_pad <string> <length>
[ ${#1} -lt $2 ] && printf "%0$(($2-${#1}))d" ''
printf "%s\n" "$1"
}
.
$ zero_pad "" 5
00000
$ zero_pad "over" 5
0over
$ zero_pad "under" 4
under
$ zero_pad "exact" 5
exact
$ zero_pad " space" 7
0 space
Просто сделайте набивку вручную. Не думаю, что есть более простое решение, если придерживаться инструментов POSIX.
while [ ${#line} -lt 20 ]; do
line=0$line
done
или
n=${#line}
while [ $n -lt 20 ]; do
printf '0'
n=$((n-1))
done
printf "$line\n"
В zsh, конечно, есть синтаксис для этого. В отличие от фрагментов выше, этот усекает строку, если она длиннее 20 символов. Если вам не нужно усечение, вы можете добавить хвост строки.
print -r ${(l:20::0:)line}
print -r ${(l:20::0:)line}${line:20}
Как уже отмечал @Gnouc, вы уже на полпути:
line='some chars'
printf '%0'$((20-${#line}))'d%s\n' 0 "$line"
###OUTPUT###
0000000000some chars
Конечно, тогда вы все еще ветер вверх с 0, даже если строка длиннее 20 символов, и это только , если printf
не выдает ошибку, потому что он неправильно обрабатывает тире -
в строке формата (что, по-видимому, более вероятно) . Тем не менее, с этим легко справиться:
printf "%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"
Эта строка формата использует printf
%.
] флаг точности либо дополнить его десятичный аргумент нулями до указанной длины, либо - в t Событие %. 0d
ноль или %. d
пустая точность - в противном случае усечение любых ведущих нулей до указанного числа. Примерно так:
printf '#%.0d%c%.5d' 0000000 ':separator' 4
#:00004
(примечание: формат % c
печатает первый символ связанного с ним аргумента)
$ ((
арифметическое выражение ))
сначала устанавливает переменную $ l
равной 20 минус $ {# line}
, затем оценивает значение 0 или 1, если $ l
меньше или больше 0 соответственно , и последний умножает это на $ l
. Поэтому, когда 20 - $ {# line}
меньше нуля, вы делаете $ ((0 * l))
, но когда оно больше, вы делаете $ ((1 * л))
.
Таким образом, вы всегда печатаете только столько ведущих нулей, сколько учитывается в разнице между 20 и $ {# line}
. Вот так:
line='some chars'
printf "#%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"
#0000000000some chars
И ...
line='some chars'
printf "#%.$((((l=4-${#line})>0)*l))d%s\n" 0 "$line"
#some chars
И можно использовать тот же %.
precision форма для поля типа s
, например:
line='some chars'
printf "#%.$((((l=4-${#line})>0)*l))d%.4s\n" 0 "$line"
#some
... для усечения по желанию.
Вот он в цикле - следующая итерация повторяется 5 раз:
line=
until line=fivec$line; [ $((l)) -lt 0 ]
do printf "#%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"
done
#000000000000000fivec
#0000000000fivecfivec
#00000fivecfivecfivec
#fivecfivecfivecfivec
#fivecfivecfivecfivecfivec
Важно отметить, что ни один из показанных нулей никогда не включается в значение какой-либо переменной оболочки - не говоря уже о $ line
- и создаются автоматически только printf
, как указано в его строке формата.
Вот тот же цикл с повышенной точностью %. 20s
:
line=
until line=fivec$line; [ $((l)) -lt 0 ]
do printf "#%.$((((l=20-${#line})>0)*l))d%.20s\n" 0 "$line"
done
#000000000000000fivec
#0000000000fivecfivec
#00000fivecfivecfivec
#fivecfivecfivecfivec
#fivecfivecfivecfivec
Еще одна вещь, которую вы можете сделать с этим, довольно забавная. Когда вы объединяете возможность printf
динамически генерировать 0 с $ IFS
, вы можете иметь любую строку сколько угодно раз, например:
IFS=0 ; printf '10 lines\n%s' $(printf %010d) ; unset IFS
###OUTPUT###
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
Проблема была фактически в /etc/security/pam_mount.conf.xml
. После некоторого урока я вставил строку
Мое понимание было то, что User =« * »
было нотаутированием по телефону, стоящей для« любого пользователя ». Оказывается, такого синтаксиса нет. Поэтому PAM_MOUNT пытался установить громкость для пользователя * и, конечно, не удалось. Это было отражено в журналах по линии Crypt_Activate_by_Passefhrase: операция не разрешена
.
Решино за счет замены * с именем моего пользователя. При необходимости MAN PAM_MOUNT.conf
имеет дополнительные варианты для более мелкого зерна.
Так что, если вы когда-нибудь столкнетесь с проблемами с PAM_MOUNT
, говоря Операция не разрешена
Проверьте, первым!
% s
- это спецификация форматирования строки. Нулевой прокладку только , определенный для существующих для числовых преобразований :
0 для d, i, o, u, x, x, a, a, e, e, f, f, g , и G, указыватели преобразования G, ведущие нули (после любого указания знака или базы) используются для прокладки ширины поля ... Для других преобразований поведение не определено.
Если ваш $ line
- это число, используйте:
printf '%020i\n' $line
, чтобы получить желаемый результат (или один из других идентификаторов цифровых форматов). Если ваше значение сложнее, но начинается с номера, вы можете использовать:
printf '%020i %s\n' $num $restofline
для объединения номера и строки вместе одновременно.