Используйте цикл оболочки и ex
!
{ for i in {1..50}; do printf %s\\n '0/old/s//new/'; done; echo x;} | ex file.txt
Да, это немного глупо.
;)
Примечание. Это может привести к сбою, если в файле менее 50 экземпляров старого
. (Я не тестировал его.) Если это так, он оставит файл без изменений.
А еще лучше использовать Vim.
vim file.txt
qqgg/old<CR>:s/old/new/<CR>q49@q
:x
Объяснение:
q # Start recording macro
q # Into register q
gg # Go to start of file
/old<CR> # Go to first instance of 'old'
:s/old/new/<CR> # Change it to 'new'
q # Stop recording
49@q # Replay macro 49 times
:x # Save and exit
Поскольку у вас достаточно места в / home
, переместите все файлы из / srv
в / home
, затем (необязательно) переместите файлы, которые находился в / home
в корневом разделе.
Самое простое решение, если вы не возражаете против простоя в несколько минут, - это переместить / srv
в больший раздел и создать символьную ссылку на него:
mv /srv /home
ln -s /home/srv /
Если вы действительно хотите переместить / home
в корневой раздел, затем потребуется несколько переименований. Я предполагаю, что нет каталога с именем / home / srv
или / srv / srv
.
mv /srv home
mkdir /srv
mount --move /home /srv
mv /srv/acme … /home/
mv /srv/srv/* /srv
rmdir /srv/srv
Наконец (если вы не используете метод символической ссылки), отредактируйте / etc / fstab
, чтобы изменить точку монтирования: в строке, которая начинается с / dev / sda9 / home
, замените / home
на / srv
.
Прежде чем что-то делать, вам нужно найти место для хранения 180 мегабайт данных, которые сейчас занимает /home. Я бы рекомендовал переразметить текущий /dev/sda9, скажем, на два гига для /home
и 42 для /srv
.
Далее вам придется быть немного хитрее. Все это лучше всего делать в однопользовательском режиме, чтобы только root вошел в систему и у вас не возникло проблем с тем, что кто-то попытается получить доступ к /home
, пока вы его перемещаете.
У вас есть приличное количество места в /var, поэтому мы будем использовать его в качестве временного места хранения:
mkdir /var/tmp/oldhome
cd /home
`tar -cvf - . / | ( cd /var/tmp/oldhome && tar -xvf - . )
Теперь у нас есть резервная копия /home
, пока мы переразбиваем /dev/sda9
на 2 гига для /dev/sda9
и 42 гига для /dev/sda10
После завершения переразметки и создания новых файловых систем (я буду считать, что вы знаете, как это делается) вам нужно отредактировать /etc/fstab
.
Где-то там вы увидите строку, в которой говорится что-то вроде
/dev/sda9 /home ext3 defaults 0 2
Предполагая, что вы сделали /dev/sda9
меньшим из двух разделов, вы можете оставить эту строку без изменений; вам просто нужно добавить
/dev/sda10 /srv ext3 defaults 0 2
прямо под ней.
После добавления этих строк просто введите
mount /home ; mount /srv
и проверьте с помощью df -h
, что оба раздела смонтированы.
Затем замените данные из /home:
cd /var/tmp/oldhome
tar -cvf - ./ | ( cd /home && tar -xvf - )
Перезагрузите систему в многопользовательском режиме и все должно заработать.
В качестве быстрого, но не очень красивого решения, вы можете перемонтировать каталог на одном из ваших менее используемых дисков в некоторую точку под /srv
и переместить туда что-нибудь, чтобы освободить немного места на /srv
.
Прочитайте о --bind
в man mount
. Это сводится к чему-то вроде mount --bind /some/spare/dir /busy/dir/mountpoint
. Это работает в любом современном Linux.
Предположим, что у вас есть /srv/some/stuff
.
mkdir /home/offload/some/stuff
- это на разделе со свободным пространством 44Gmv /srv/some/stuff /srv/some/previous-stuff
- временно, освободить имяmount --bind /home/offload/some/stuff /srv/some/stuff
- теперь some/stuff находится на другом разделе! mv /srv/some/previous-stuff/* /srv/some/stuff
- верните все под оригинальное имя, освободите место на /srv.