Вопрос или проблема
Для объединения файлов/устройств в линейном режиме в Linux у меня есть скрипт dm-joinlinear.sh
из:
объединение файлов/устройств в линейном режиме в системе Linux, спасибо telcoM
#!/bin/sh
usage() {
echo "Использование: ${0##*/} <имя цели> <компонент...>" >&2
exit 64 # EX_USAGE
}
if [ "$1" = "" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "--help" ]
then
usage
fi
if [ -e "/dev/mapper/$1" ]
then
echo "ОШИБКА: цель $1 уже существует." >&2
exit 73 # EX_CANTCREAT
fi
MAPNAME="$1"
shift
DMMAP=$(mktemp)
trap "rm -f $DMMAP" EXIT
sum=0
while [ "$1" != "" ]
do
if [ ! -e "$1" ]
then
echo "ОШИБКА: $1 не существует"
exit 66 # EX_NOINPUT
fi
if [ ! -b "$1" ]
then
echo "ОШИБКА: $1 не блочное устройство"
exit 69 # EX_UNAVAILABLE
fi
srcN="$1"
sizeN=$(blockdev --getsz "$srcN")
echo "$sum $sizeN linear $srcN 0" >>$DMMAP
sum=$(expr $sum + $sizeN)
shift
done
dmsetup create $MAPNAME < $DMMAP
объединение определенного числа файлов/устройств в линейном режиме в системе Linux
Спасибо glenn jackman за способ объединения определенного числа файлов/устройств.
n=33
devices=()
for ((i = 0; i < n; i++)); do
devices+=("/dev/loop${i}")
done
dm-joinlinear.sh one "${devices[@]}"
Теперь я ищу способ объединить определенные файлы/устройства из списка в файле.
Как поместить их в массив, чтобы передать в dm-joinlinear.sh?
Есть 4 файла:
groupAfiles.txt
file14
file2
file4
file9
groupDfiles.txt
file1
file5
file17
file18
file15
file7
groupCfiles.txt
file3
file20
file16
file6
и groupDfiles.txt
file19
file12
file10
file8
file11
file13
В этом примере всего 20 файлов в 4 группах для объединения, общее количество файлов всегда составляет от 4 до 99, и в этом примере только 4 группы.
Как передать имена из group*files.txt
в отдельные массивы для dm-joinlinear.sh
, как что-то вроде
./dm-joinlinear.sh groupA "${devicesAgroup[@]}"
./dm-joinlinear.sh groupB "${devicesAgroup[@]}"
./dm-joinlinear.sh groupC "${devicesAgroup[@]}"
./dm-joinlinear.sh groupD "${devicesAgroup[@]}"
например, это должно быть /dev/mapper/file19
вместо file19
?
Ответ или решение
Для выполнения задачи по объединению файлов или устройств в линейном режиме в системе Linux с использованием представленного скрипта dm-joinlinear.sh
, необходимо следовать определенной последовательности действий. В данном ответе мы объясним, как загрузить имена файлов из списка в массив и передать их в скрипт для обработки.
Шаг 1: Подготовка файлов
Предположим, у вас есть четыре текстовых файла, каждый из которых содержит список имен файлов, которые вы хотите объединить. Эти файлы называются:
groupAfiles.txt
groupBfiles.txt
groupCfiles.txt
groupDfiles.txt
Шаг 2: Создание скрипта
Мы будем создавать Bash-скрипт, который будет считывать имена файлов из указанных файлов и передавать их в dm-joinlinear.sh
как массивы. Нам нужно убедиться, что путь к каждому файлу начинается с /dev/mapper/
, чтобы скрипт dm-joinlinear.sh
мог корректно их обработать.
Вот пример скрипта, который выполняет эти задачи:
#!/bin/bash
# Функция для загрузки файлов из текстового файла в массив
load_devices() {
local group_file=$1
local -n device_array=$2 # Используем ссылку на массив (ассигнование по ссылке)
while IFS= read -r line; do
device_array+=("/dev/mapper/${line}")
done < "$group_file"
}
# Определяем массивы для каждой группы
devicesAgroup=()
devicesBgroup=()
devicesCgroup=()
devicesDgroup=()
# Загружаем устройства из файлов
load_devices "groupAfiles.txt" devicesAgroup
load_devices "groupBfiles.txt" devicesBgroup
load_devices "groupCfiles.txt" devicesCgroup
load_devices "groupDfiles.txt" devicesDgroup
# Выполняем скрипт dm-joinlinear.sh для каждой группы
./dm-joinlinear.sh groupA "${devicesAgroup[@]}"
./dm-joinlinear.sh groupB "${devicesBgroup[@]}"
./dm-joinlinear.sh groupC "${devicesCgroup[@]}"
./dm-joinlinear.sh groupD "${devicesDgroup[@]}"
Шаг 3: Пояснение кода
-
Функция
load_devices
: Эта функция принимает имя файла и ссылку на массив. При чтении файла она добавляет каждый элемент, добавляя/dev/mapper/
к имени, в массив переданный по ссылке. -
Создание массивов: Мы создаем массивы для каждой группы и вызываем функцию
load_devices
для загрузки данных. -
Вызов скрипта: После заполнения массивов мы вызываем
dm-joinlinear.sh
, передавая имя группы и массив устройств.
Шаг 4: Запуск скрипта
Сохраните скрипт, например, как join_devices.sh
, и сделайте его исполняемым:
chmod +x join_devices.sh
Затем выполните его:
./join_devices.sh
Заключение
Таким образом, с помощью данного подхода вы можете динамически загружать устройства из файлов и передавать их в скрипт для объединения. Убедитесь, что файлы с именами существуют и доступны для чтения, а устройства корректно связаны в системе. Это поможет вам эффективно управлять процессом объединения в линейном режиме.