找到名称为.XXX.swp的交换文件

时间:2020-01-09 10:38:26  来源:igfitidea点击:

我们是否正在为某些扩展名为.swp的文件"按名称找到交换文件"?
我们是否正在尝试使用诸如vim或者vi之类的编辑器打开文件并收到此消息?
我们要摆脱此消息吗?
该解决方案非常容易,只需删除报告的.swp文件即可,但是重要的是要正确解决此问题,否则可能会丢失未保存的数据。

在本教程中,我将分享正确解决此警告消息的步骤,在多种情况下,我们都会收到此消息,因此在采取任何"操作"之前,请正确阅读本文。

什么是.swp文件?

为什么需要此文件?

  • 在我们进入解决方案部分之前,我们知道这个.swp文件是什么,为什么在那里?
    如果我们确实需要此文件?

  • 即使扩展名使用.swp,也请NOTE,这些文件与SWAP内存无关,因此请不要与它们混淆

  • 我们使用Vim/Vi编辑器打开文件后即会创建一个.swp文件。

  • 在Unix和Linux上,以'.'开头可以交换与已编辑文件位于同一目录中的文件名。

  • 这样可以避免交换文件显示在目录列表中,因为Unix和Linux会将其视为隐藏文件。

  • " Vim"将我们更改的内容存储在交换文件中。

  • 使用我们从中开始的原始文件加上交换文件,我们几乎可以恢复工作。

  • 我们可以使用:sw [apname]查看当前交换文件的名称。

  • 交换文件的名称通常与我们正在编辑的文件相同,扩展名为"。

swp 
If this file already exists (e.g., when you are recovering from a crash) a warning is given and another extension is used,  .swo ,  .swn , etc.
An existing .swp

文件将永远不会被覆盖。

  • 一旦" Vim"停止编辑交换文件,"交换"文件将被"删除"。

我们可以使用来了解有关此文件的更多信息。

# vim +help\ swap-file

删除.swp文件是否安全

  • 答案不是那么直接。

  • 可能是不同的用户使用任何编辑器同时修改了同一文件。

  • 因此,假设用户root正在终端1中修改/tmp/file的内容,另一个用户以root用户身份从不同终端登录,并尝试访问相同文件进行编辑

  • 在这种情况下,我们会得到

process ID: 1453 (still running)
  • 因此我们知道有人已经在访问该文件,其名称为" PID 1453"。
# ps -p 1453
  PID TTY          TIME CMD
 1453 pts/1    00:00:00 vim
  • 因此,在这种情况下,建议"退出"编辑器而不进行任何更改。

  • 就像我们选择继续使用"编辑"一样,将创建两个具有不同扩展名的交换文件,如我们在此处看到的:

# ls -l /tmp/.file.sw*
-rw-r--r-- 1 root root 12288 Jan 30 11:54 /tmp/.file.swo
-rw-r--r-- 1 root root 12288 Jan 30 11:54 /tmp/.file.swp
  • 这可能会导致问题,因为同一文件将有两个不同的版本

  • 因此,如果我们收到以下消息以及通过名称找到交换文件

process ID: 1453 (still running)
  • 然后,我们应该选择"退出"或者"中止",以使来自第一个用户的更改完好无损,并且不要删除" .swp"文件。
    尽管我们可以在"只读"模式下打开该文件以仅查看变化
Swap file "/tmp/.file.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

如何修复"通过名称找到交换文件"?

解决此问题的方法很简单,即可以克服此警告,即继续进行操作,然后使用rm -f/path/.file.swp删除报告的.swp文件,但是这样做会使我们失去恢复文件的任何机会。
因此,在删除文件之前,首先要从.swp文件中恢复内容,这一点很重要。

此警告的一个示例代码段

E325: ATTENTION
Found a swap file by the name "/tmp/.file.swp"
          owned by: root   dated: Sat Jan 30 13:37:50 2017
         file name: /tmp/file
          modified: no
         user name: root   host name: client.example.com
        process ID: 1756
While opening file "/tmp/file"
             dated: Sat Jan 30 12:52:50 2017
(1) Another program Jan be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r /tmp/file"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file "/tmp/.file.swp"
    to avoid this message.

从SWP文件恢复到其他文件

  • 我们在编辑某些文件时上次Vim/Vi会话可能由于某种原因而崩溃,而最新更改未保存

  • 就我而言,我的/tmp/file崩溃了,我无法保存最新内容

  • 现在,当我尝试使用vim编辑器打开/tmp/file时,收到此警告。
    找到一个名为" /tmp/.file.swp"的交换文件。

  • 现在我可以选择"恢复"内容,但是我不确定"将恢复什么内容?
    "

优良作法是将恢复的文件写入其他位置。
因此,我将创建一个新文件file_recover,我们可以使用任何名称,因为没关系

# touch /tmp/file_recover

接下来使用vi/vim编辑器打开该文件

Esc并输入:rec <path/of/file>以在此新文件中执行恢复。
对于我们的示例:rec/tmp/file

启动文件恢复

此命令将使用/tmp/.file.swp/tmp/file的内容恢复到当前文件中,即/tmp/file_recover
检查"恢复"的状态。
如果.swp文件损坏,则恢复也可能失败。

恢复完成

在"比较已恢复内容与原始内容之间的差异"旁边,按Esc键,然后按:DiffOrig键,然后按Enter键。

启动DiffOrig进行比较

这会将终端分成两个窗口,原始文件和恢复文件的内容有所不同。
其中我们可以检查并决定是否要继续进行恢复。

恢复后比较内容如果选择继续执行"恢复",则可以从两个文件中退出而不保存。
Esc,然后按:q退出而不保存

现在,使用vi或者vim编辑器打开原始文件,该编辑器将再次向我们显示警告,我们还将在终端底部看到以下消息

修复发现了一个名称为交换文件的文件因为我们知道Recovery是有效的,所以请按R键启动恢复

恢复已完成因此恢复成功。
按" Enter"继续编辑文档。

一旦确定恢复正常,请删除交换文件。
否则,我们将继续收到警告消息,表明.swp文件已经存在

# rm -f /tmp/.file.swp

从SWP文件恢复到同一文件

如果我们知道更改的内容并且不需要进行任何类型的比较,则可以直接使用vim -r <file>从.swp文件中恢复内容。

例如,其中我将使用带有-r的vim直接编辑文件以打开文件,并从上次保存的swp缓冲区中恢复内容。

# vim -r /tmp/file

使用vim -r恢复这表明Recovery已经完成。
点击" Enter"继续编辑文档。

完成后,保存并退出文件,然后继续删除" swp"文件,以避免进一步的警告

# rm -f /tmp/.file.swp

删除SWP文件而不进行恢复

如果我们不希望从交换文件中的上一个保存状态中恢复内容。
我们可以继续删除.swp文件,以避免任何进一步的警告。

重要说明:一旦删除该.swp文件,将无法得知更改,这些更改将丢失在原始文件中。
所以我希望你知道你在做什么

# rm -f /tmp/.file.swp

如何避免使用交换文件?

  • 所以我们不想使用交换文件?
    这是可能的,但"不推荐"

  • 我们可以使用vim -n开始编辑文件,其中-n将确保在编辑相应文件时没有创建交换文件。

  • 在这种情况下,如果vim崩溃,则无法从该文件中恢复未保存的数据。

在此示例中,从1号航站楼开始,我将打开/tmp/file进行编辑

# vim -n /tmp/file

从其他文件中,如果我检查该文件的.swp文件

# ls -l /tmp/.file.sw*
ls: cannot access '/tmp/.file.sw*': No such file or directory

不出所料,没有创建.swp文件。