Как я могу восстановить исходный файл из файла .swp?


57

Я попытался открыть файл .swp , используя viи , catно она показывает мусор.


Вы используете vi или vim?
2010 года

Это работает с emacs? (или возвышенное, нано, ред и т. д.)
откровенно

Ответы:


94
vim -r .swp

Это переходит в режим восстановления и дает вам больше информации. Я думаю, что это то, что вы хотите.

.swX-файлы остаются, если сеанс с несохраненным файлом был убит / аварийно завершен / произошло что-то еще плохое. Они также присутствуют во время открытия несохраненного буфера в сеансе Vim. vim -rчитает эти временные файлы и воссоздает содержимое. После того, как вы его восстановите, просто сохраните его как обычно, например :w newfilename.


8
Именно то, что я искал. Для всех остальных это способ восстановления еще не сохраненных файлов. Вышеуказанные методы работают нормально, если файл уже существует, но вы не можете открыть файл без имени.
Эрик Ху,

17

Вам не нужно иметь оригинальный файл для восстановления .swp. Просто откройте файл, как будто он существует. vim будет искать файл с расширением .swp и предложит его восстановить.

например:

$ ls -a
. .. .test.txt.swp
$ vim test.txt
[...]
Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Просто нажмите R, чтобы восстановить его и: wq файл

Изменить: Обратите внимание, что файл .swp содержит только изменения, внесенные в файл (см. Комментарий). Это означает, что вам нужно будет извлечь последнюю копию файла из резервной копии, а затем использовать vim для восстановления последних изменений. Если у вас нет резервной копии файла, вам действительно не повезло.


2
Вы определенно должны иметь оригинальный файл, без которого данные в файле .swp бесполезны. Смотрите ": swap-файл справки". В некоторых случаях он может работать без исходного файла, но файл .swp хранит только информацию об изменениях и требует некоторой начальной точки для применения этой информации во время восстановления.
Гептит

Вы правы, конечно. Я на самом деле не знал об этом vim. Но это только логично, так как хранение полной копии исходного файла было бы огромной тратой. Тогда ответ таков: восстановите ваш файл из резервной копии, затем используйте vim для восстановления последних изменений.
Вегар Вестерлунд

Хранение всего файла в одном SWP-файле было бы расточительным, да, но я вижу потенциальную ценность в накоплении SWP-файлов (когда он включен). По той же причине, по которой вы редактируете через diff и исправляете оригинал только при явном сохранении, это имеет смысл для меня если бы вы могли организовать последовательность различий, сгенерировать частичную сумму (даты до сегодняшнего дня -> ночью; ночью + сегодня = текущее) и т. д. Я нашел ': pre [serve] `в мануэле, я думаю, что это работает именно так. В любом случае, самая важная строка:The original file is no longer needed for recovery.
Джон Р

Похоже, это работает - :preserveи :set cpoptions=...&оставляет в каталоге файл .swp и .swo и предлагает восстановить любой из них. Используя vim -r <file>вы можете выбирать между .swp и .swo. Дальнейшие изменения генерируют .swn, .swm и т. Д., Которые, по-видимому, являются частичной суммой свопов до этой точки. Вы можете вернуться к версии по своему вкусу и отредактировать (~ = fork) или сохранить (~ = stash). В конце концов, вы можете архивировать файлы подкачки, демонизировать их резервные копии и т. Д. Я могу ошибаться в деталях, когда речь идет о больших файлах - я не уверен, как это влияет на дополнительные файлы подкачки - см. Ниже.
Джон П

(Продолжение) - буфер содержит флаги, и именно буфер создает файлы подкачки, поэтому даже если флаги не установлены из глобальной конфигурации или автозагрузки, они наследуются во время самого восстановления. Чтобы заменить последовательность восстановления одним файлом восстановления, вы можете переместить нужный раздел подкачки в .swp и скрыть остальные. Я хотел бы узнать больше о совпадении между восстановлением файлов и управлением сессиями Vim, если кто-то может заполнить пробелы.
Джон П


7

1 Откройте файл подкачки .file.swpвvim

2 :recoverвосстановит ваш файл


7

Прочитав комментарии Вегара Вестерлунда и Heptite, я захотел узнать, в какой момент vim требуется исходный файл (или резервная копия) для восстановления из файла .swp. Вот что сделал:

Я открыл файл 975 строк, отредактировал его в строке 949 (создание .swpфайла) и завершил процесс, затем удалил оригинал. $ vim Original_Fileспросил, хочу ли я восстановиться после .swp »> да; только первые 68 строк и последние 34 строки (начиная с 8 строк выше моего редактирования) были фактически восстановлены.

Затем я повторил тест с небольшими файлами: от 20 до 200 строк файл .swp содержал 100% исходного содержимого. Но при 300 строках в .swp были включены только первые 68 и 18 последних строк (начиная с 2 строк выше моего редактирования).

В заключение полезно знать, что vim всегда сохраняет «header» и «bottom» файла в файлах .swp. Может быть, есть настройка, чтобы контролировать, сколько строк должно содержать .swp?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.