Сценарий Bash для добавления динамического пути к существующему файлу .ini, возможно, с использованием sed?

у меня есть файл .sqlite с общим именем, содержащийся во многих уникальных домашних папках пользователя со структурой файла: /home/user/unique-ip-address/folder/file.sqlite. Я решил переместить все эти файлы .sqlite в tmpfs mount и уже сделали это, поддерживая полную структуру каталогов, поэтому каждый файл .sqlite теперь находится в: /mnt/tmpfs/home/user/unique-ip-address/folder/file.sqlite

Я ищу способ редактировать файл .ini с общим именем в домашней папке каждого пользователя с уникальным путем к файлу (например: /home/user/unique-ip-address/folder/file.ini), я думаю, используя find и sed должен помочь, но я не уверен, как результаты поиска должны сопоставлять пользователя с правильной папкой в ​​/mnt/tmpfs. Я хотел бы добавить новое местоположение .sqlite, используемое в /dev/shm, в файл.ini в своих домашних папках после dir= в файле.ini. Спасибо!


person bleomycin    schedule 30.04.2010    source источник
comment
Это разовая акция или вы хотите делать это регулярно? Другими словами, будет ли достаточно взлома или вам нужно что-то надежное и надежное?   -  person High Performance Mark    schedule 30.04.2010


Ответы (1)


Я считаю, что что-то вроде этого должно помочь:

find /home/*/unique-ip-address/folder/file.ini | xargs -n1 perl -pe 'BEGIN{$infile="/mnt/tmpfs/$ARGV[0]"} {s/dir=/$&$infile/}'

Эта команда ничего не меняет, она просто все выводит. Если похоже, что он делает то, что вы хотите, просто добавьте -i.bak в самый конец, и он внесет изменения на месте. Исходный файл будет переименован в file.ini.bak.

find /home/*/unique-ip-address/folder/file.ini | xargs -n1 perl -pe 'BEGIN{$infile="/mnt/tmpfs/$ARGV[0]"} {s/dir=/$&$infile/} -i.bak'

person frankc    schedule 30.04.2010
comment
Спасибо за помощь! Это отлично работало с небольшими изменениями, и это был просто взлом, а не то, что нужно делать регулярно. - person bleomycin; 01.05.2010
comment
Кроме того, я полагаю, что единственное, что может сделать это намного лучше, на случай, если мне понадобится запустить его в будущем или более одного раза прямо сейчас, sed выгружает строку database= поверх любого существующего изменения, поэтому, если скрипт запускается два раза все ломает. Есть ли способ проверить, была ли установлена ​​база данных =, или проще просто удалить строку базы данных = из файла .ini каждый раз, когда он запускается, и заменять ее с нуля? - person bleomycin; 01.05.2010
comment
предполагая, что ваша строка dir=/database= представляет собой одну строку, просто измените s/dir=/ на s/dir=.*$/, чтобы она захватила все до конца строки. по крайней мере, это то, что я думаю, что вы имеете в виду. - person frankc; 01.05.2010