Как заменить содержимое файла, содержащегося в выводе переменной

Ваш физический том LVM составляет 50 ГБ, но раздел, в котором он находится, имеет размер 100 ГБ. Чтобы использовать большую часть емкости логического тома www, вам необходимо выполнить три шага:

  1. Увеличить физический том LVM:pvresize /dev/xvdj1
  2. Увеличьте свой wwwлогический том:lvextend -l 100%FREE /dev/data/www
  3. Увеличьте файловую систему, которая зависит от того, какую файловую систему вы используете.

Примечание. :Вы можете использовать параметр -rс lvextendдля изменения размера логического тома и файловой системы с помощью одной команды.

0
29.12.2020, 05:16
2 ответа

Ваша переменная SNAPSHOTSсодержит пробелы. Чтобы перенаправить на его значение, заключите его в двойные кавычки:

echo > "$SNAPSHOTS"/test

Это, скорее всего, не будет делать то, что вы хотите, поскольку вы, кажется, хотите сохранить несколько путей в SNAPSHOTS. Вы не можете хранить несколько отдельных строк в одной строке и думать, что сможете правильно извлечь их из этой единственной строки. Это действительно должен быть массив, а здесь вообще не нужно ls:

shopt -s nullglob

SNAPSHOTS=(root*/)

for snap in "${SNAPSHOTS[@]}"; do
    echo >"$snap"/test
done

или просто

shopt -s nullglob

for snap in root*/; do 
    echo >"$snap"/test
done

Установка параметра оболочки nullglobгарантирует полное удаление шаблона, если он ничему не соответствует. Без nullglobшаблон сохраняется как есть, если он ничему не соответствует.

Если вы хотите поместить пустую строку не во многие тысячи файлов, вы также можете

shopt -s nullglob

SNAPSHOTS=(root*/)
echo | tee "${SNAPSHOTS[@]/%//test}" >/dev/null

Если вы действительно хотите просто создать файлы (не записывать в них пустую строку ), тогда используйтеtouch:

shopt -s nullglob

SNAPSHOTS=(root*/)
touch "${SNAPSHOTS[@]/%//test}" 2>/dev/null
0
18.03.2021, 22:40

Вы, ребята, все знаете и объясняете ответ, чтобы мы могли понять, этот веб-сайт представляет собой невероятную базу данных.

В конце концов я пошел с

for i in root*/
do
    if [ "$i" != 'root*/' ]
    then
        sudo touch "$i"/test
    fi
done

Здесь используется sudo, потому что эти папки со снимками принадлежат пользователю root.

Итак, теперь я понимаю свой первый шаг, который заключается в создании, переименовании, удалении, изменении разрешений и т. д. для файла в списке папок, возвращаемом внутри переменной.

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

Я не понимаю, как интегрировать переменную в значение, которое я хочу заменить.

Я изменил структуру своих снимков, чтобы упростить для себя (сценарий ). Итак, теперь переменная со списком всех папок в папке возвращает следующее:

echo $SNAPSHOTS
2020-12-22_19H05/
2020-12-23_19H05/
2020-12-24_19H05/
2020-12-25_19H05/
2020-12-26_19H05/
2020-12-27_19H05/
2020-12-28_19H05/

В каждой из этих папок, для которых имена каталогов меняются каждый день (самый старый день удаляется, а сегодняшний день добавляется ), есть файл, расположенный в /etc/fstab, поэтому 2020-12-22_19H05/etc/fstabв качестве примера.

Мне нужно отредактировать этот файл, найти фиксированное значение «@home» и заменить его на переменную часть строки фиксированного префикса, например:

@snapshots/daily/home/$VARIABLE

$VARIABLE = имена каталогов, возвращаемые первой переменной, перечисленной выше.

Таким образом, в папке 2020-12-22_19H05/файл /etc/fstabбудет отредактирован, чтобы заменить @homeна @snapshots/daily/home/2020-12-22_19H05без /в конце, его необходимо опустить/урезать. И так для всех папок, найденных по первой переменной.

Я ожидаю, что будут использоваться sed и, возможно, %, но я действительно понятия не имею, что искать в Интернете, чтобы 1 -получить ответ, но в основном 2 -понять ответ.

Спасибо!

0
18.03.2021, 22:40

Теги

Похожие вопросы