LINUX.ORG.RU

Как сохранять файл на прежнее место

 , ,


1

1

Привет, ЛОР.

Передо мной время от времени возникает весьма ненормальная и извращённая задача — редактировать довольно большой (6 мегабайт) текстовый файл на небольшом разделе (оставшееся свободное место меньше тех самых 6 мегабайт). То есть нужно, чтобы редактор умел сразу писать файл на старое место.

До сих пор я успешно решал задачу с помощью mcedit. Но вот сейчас я потихоньку осваиваю vim, и заинтересовался, а он так умеет?

Запускаю vim.

:set noswapfile
:set nobackup
:e this_huge_file.txt

Правлю (редактирую пару байт). Пытаюсь сохранить файл. Получаю ошибку E514. На большЕм разделе, естественно, всё работает.

Можно ещё что-то в настройках подкрутить?

Да, задача ненормальная, и вопрос я задаю, скорее, из «спортивного интереса». А также потому, что теоретически похожая задача может возникнуть, условно говоря, «в горящем танке». Если vim так не умеет — окей, буду иметь в виду, что в таких случаях нужны другие инструменты (mcedit, как я уже сказал, справляется).

P.S. Периодические бэкапы с файла делаются, поэтому за его физическую сохранность просьба не беспокоиться.

P.P.S. Вопрос «А что мы будем делать, когда и под сам файл места не хватит» — вопрос отдельный.

★★★★★

Последнее исправление: hobbit (всего исправлений: 3)

Есть backupcopy:

$ touch a
$ ls -i a
6689163 a
$ vim a '+set backupcopy=yes' '+wq'
$ ls -i a
6689163 a

Также на правах костыля: Vim не делает запись через переименование нового файла, если на исходный файл больше одной (жёсткой) ссылки:

$ touch a 
$ ls -i a
6689151 a
$ vim a '+wq' 
$ ls -i a
6689163 a
$ ln a b
$ vim a '+wq'
$ ls -i a
6689163 a
lwo
()

весьма ненормальная и извращённая задача

В рамках такого ТЗ можно на другом разделе редактировать. Т.е. копировать туды-суды.

ashot ★★★★
()

Попробуй еще set nowritebackup

habamax ★★★
()

В mcedit раньше из-за такого поведения часто терял файлы целиком. Он усекал файл при сохранении и потом не мог его расширить обратно. Вроде теперь поведение помееялось и он пытается писать в новый файл

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Вроде теперь поведение помееялось и он пытается писать в новый файл

Это настраивается. В mcedit есть режим «быстрого сохранения» и «безопасного сохранения», там же указывается, создавать ли резервные копии.

Вообще, этот момент надо обдумать, конечно. Жертвовать надёжностью неохота, возможно, в моём случае всё же лучше размеры файловой системы пересмотреть (там есть загоны организационного характера, но скорее всего, они решаемы). А вот в случае «горящего танка», когда такая задача возникнет внезапно… Впрочем, наверное, и в этом случае будет надёжнее скопировать файл на внешний носитель и там отредактировать.

Пожалуй да, «довольно извращений», эту стюардессу проще закопать

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

Ну, в принципе если изменённый текст совпадает по размеру со старым то можно писать прямо на месте. Честно говоря я сначала подумал что вопрос именно про это. Но, да, развлечение то ещё.

sin_a ★★★★★
()

Мне кажется, здесь какой-то низкоуровневый доступ к ФС нужен. Причем не факт, что ФС вообще так умеет. Т.е. умеет сохранять файл по его старым секторам. Мне кажется, это очень муторно со стороны файловой системы. А что если файл окажется больше выделенного под него старого места? Выделять еще прям в процессе записи? Это медленно.

Если бы я писал ФС, то первый подход, который мне приходит в голову, это выделить под файл новые секторы, записать данные и только потом пометить старые секторы как свободные. Но, возможно, конечно если детально думать об этом, наверняка есть подходы побыстрее.

Т.е. тут не только в редакторе дело. Еще и в ФС, позволяет она это или нет.

hibou ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.