Следующий скрипт bash перебирает все файлы в текущем каталоге, которые соответствуют шаблону (something )подчеркивание (something )тире (something )подчеркивание (something )подчеркивание (что-то ), а затем выбирает соответствующие поля для сравнения. Синтаксис ${field:4:2}
означает получение значения $field
, начиная с позиции 4, и извлечение двух символов.
Затем различные части сравниваются в соответствии с указанной вами логикой, и присваивается переменная code
.
#!/bin/bash
for f in *_*-*_*_*
do
field=${f#*_}
field=${field%%-*}
col23=${field:2:2}
col45=${field:4:2}
col678=${field:6:3}
if [ "$col23" = "yy" ]
then
case $col45 in
(00|01|02)
if [ "$col678" = "abc" ]
then
code=usa
else
code=uk
fi
;;
(*)
code=Aus
;;
esac
else
code=Aus
fi
echo "For file $f, code is: $code"
done
Чтобы ответить на свой вопрос, я провел следующий эксперимент на запасном жестком диске. Убедитесь, что у вас есть действительная и восстанавливаемая резервная копия. Эти команды могут безвозвратно уничтожить ценные данные, если, например. применено к неправильному устройству.
Сначала нам нужны два раздела для работы, я создал их с помощью fdisk, чтобы получить:
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 20973567 20971520 10G 83 Linux
/dev/sda2 20973568 41945087 20971520 10G 83 Linux
Затем я создал незашифрованный btrfs raid1 (вам нужно принудительно -f, если используются разделы, но убедитесь, что вы знаете, что делаете):
> mkfs.btrfs -m raid1 -d raid1 /dev/sda1 /dev/sda2
...
Devices:
ID SIZE PATH
1 10.00GiB /dev/sda1
2 10.00GiB /dev/sda2
Затем я смонтировал файловую систему для работы с работающей системой и создал тестовый файл:
> mount /dev/sda1 /mnt/tmp
> echo "Hello World" > /mnt/tmp/hello.txt
Сначала измените размер файловой системы, чтобы позже мы могли заменить устройства меньшими зашифрованными версиями.
> btrfs fi resize 1:9G /mnt/tmp
> btrfs fi resize 2:9G /mnt/tmp
Затем мы удаляем дублирование в системе (необходимо принудительно, так как это увеличивает риск потери данных ). Это занимает много времени в большой файловой системе, так как перезаписывает все данные. Мы можем проверить прогресс с помощью btrfs balance status /mnt/tmp
.
> btrfs balance start -mconvert=single -dconvert=single /mnt/tmp --force
Done, had to relocate 3 out of 3 chunks
Затем мы можем удалить одно из устройств. Если это займет много времени, мы можем проверить статус, используя btrfs device usage /mnt/tmp
.
> btrfs device remove 1 /mnt/tmp
> btrfs device usage /mnt/tmp
/dev/sda2, ID: 2
Device size: 10.00GiB
Device slack: 1.00GiB
Data,single: 1.00GiB
Metadata,single: 256.00MiB
System,single: 32.00MiB
Unallocated: 7.72GiB
Затем мы конвертируем его в устройство LUKS
> cryptsetup luksFormat /dev/sda1
> cryptsetup luksOpen /dev/sda1 crypt_1
Добавляем зашифрованное устройство в файловую систему и удаляем другое
> btrfs device add /dev/mapper/crypt_1 /mnt/tmp
> btrfs device remove /dev/sda2 /mnt/tmp
Это снова займет много времени для файловой системы с большим количеством данных, так как все данные должны быть перемещены.
Затем мы конвертируем другое устройство в LUKS, добавляем его обратно в файловую систему и балансируем как Raid1:
> cryptsetup luksFormat /dev/sda2
> cryptsetup luksOpen /dev/sda2 crypt_2
> btrfs device add /dev/mapper/crypt_2 /mnt/tmp
> btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/tmp
Done, had to relocate 3 out of 3 chunks
Конечно, последняя команда снова займет много времени, если у нас много данных. Проверим результат:
> btrfs filesystem show /mnt/tmp
Label: none uuid: e894df1a-b62f-49cb-bcdc-8e6eb25945a4
Total devices 2 FS bytes used 448.00KiB
devid 3 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_1
devid 4 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_2
> btrfs filesystem df /mnt/tmp
Data, RAID1: total=1.00GiB, used=320.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
Вуаля, у нас есть RAID 1 на двух зашифрованных устройствах, все еще содержащий наши данные!
> cat /mnt/tmp/hello.txt
Hello World