Вероятно, проблема с размером сектора. Некоторые корпуса USB заявляют, что их диски имеют секторы по 4 КиБ, когда диск представляет собой секторы по 512 байт или наоборот. Таблицы разделов (как msdos, так и gpt), к сожалению, зависят от размера сектора. Если размер сектора изменится, таблица разделов станет недействительной.
Это проблема, которую можно решить программно - Linux можно сделать достаточно умным, чтобы правильно интерпретировать таблицу разделов GPT, независимо от размера физического сектора, который, по утверждениям, имеет диск. Но он этого не делает и, вероятно, не является частью стандарта, поэтому ...
Что вам нужно сделать, так это получить точные байтовые смещения ваших разделов при закрытии USB
parted /dev/usbdrive unit b print free
, а затем посмотреть, эти смещения разделов работают для внутреннего диска
losetup --find --show --read-only --offset 1048576 /dev/internaldrive
file -s /dev/loopX
, и если это сработает, заново создайте таблицу разделов с такими же (байтовыми) смещениями для внутреннего диска (сначала сделайте резервную копию первых / последних нескольких мегабайт диска )
parted /dev/internaldisk unit b mklabel gpt mkpart 1048576 42424242 ...
Я не знаю, существует ли разделитель, который достаточно умен, чтобы «восстанавливать» такие таблицы разделов с неправильным размером сектора автоматически. Это лучше ручного подхода, но ...
Использовать поток с и или:
sudo./list_members Physicians | sed 's/^/Physicians /'
Чтобы сделать ее вспомогательной функцией, вы можете предпочесть awk
, хотя:
prefix() { P="$*" awk '{print ENVIRON["P"] $0}'; }
sudo./list_members Physicians | prefix 'Physicians '
Если вы хотите использовать префикс как для stdout, так и для stderr, это можно сделать с помощью:
{
sudo./list_members Physicians 2>&1 >&3 3>&- |
prefix 'Physicians ' >&2 3>&-
} 3>&1 | prefix 'Physicians '
Я предлагаю вам использовать утилиту ts
из пакета moreutils. Хотя его основной целью является добавление к выходным строкам метки времени, он может использовать произвольную строку вместе с меткой времени или вместо нее
for line in {01..05}; do echo $line; done | ts "A string in front "
A string in front 01
A string in front 02
A string in front 03
A string in front 04
A string in front 05
Вы также можете сделать это с помощьюawk
:
$ sudo./list_members | awk '{print "Physicians "$0}'
Physicians user@domain.com
Physicians user2@domain.com
Physicians user3@domain.com
Physicians user4@domain.com
Или сxargs
:
$ sudo./list_members | xargs -n1 echo 'Physician'
Если вы знаете, что ваш ./list_members
будет включать более 1 аргумента, вы можете использовать этот xargs
, который вместо этого разделяет входные данные на \n
:
$ sudo./list_members | xargs -n1 -d $'\n' echo 'Physician'
Physician user@domain.com xxx
Physician user2@domain.com yyy
Physician user3@domain.com zzz
Physician user4@domain.com aaa
Использование оболочки Bourne (или BASH, который является расширенным набором ), позволит сохранить решение на 100% POSIX:
sudo./list_members | while read LINE; do echo "Prefix ${LINE}"; done