объединить конкретные файлы/устройства из списка файлов в линейном режиме в системе Linux

Вопрос или проблема

Для объединения файлов/устройств в линейном режиме в 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

Заключение

Таким образом, с помощью данного подхода вы можете динамически загружать устройства из файлов и передавать их в скрипт для объединения. Убедитесь, что файлы с именами существуют и доступны для чтения, а устройства корректно связаны в системе. Это поможет вам эффективно управлять процессом объединения в линейном режиме.

Оцените материал
Добавить комментарий

Капча загружается...