Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 刪除 Swap 交換文件/分區殘留文件:.swp 恢復文件清理與 Vim 會話管理

編輯:關於 Linux

在 Linux 使用 Vim/Vi 編輯文件時,若會話異常中斷(SSH 斷開、終端關閉、系統崩潰、殺進程),Vim 會在原文件同目錄下創建 .swp 交換文件保存未寫入磁碟的修改。下次打開同一文件時,Vim 會提示檢測到交換文件,提供恢復、刪除、編輯、放棄等選項。本文詳細講解 .swp 文件機制、清理方法、恢復流程與預防最佳實踐。

.swp 文件機制詳解

  • 觸發條件:打開文件進行編輯(進入插入模式或修改內容),Vim 在同目錄創建 .文件名.swp(隱藏文件)。
  • 內容:未保存的修改、光標位置、標記、撤銷歷史、選項設置等會話狀態。
  • 更新頻率:默認每 200 字符或 4 秒同步一次(由 `updatetime`、`updatecount` 控制)。
  • 正常結束:`:wq` / `:x` / `ZZ` 保存退出時,自動刪除 .swp。
  • 異常殘留:進程收到 `SIGHUP`/`SIGTERM`/`SIGKILL`、SSH 斷開、終端關機、系統掛起/崩潰、磁碟滿導致寫入失敗。

Vim 啟動時檢測到 .swp 的處理選項


E325: ATTENTION
Found a swap file by the name ".test.txt.swp"
          owned by: user   dated: Mon Jan 25 10:00:00 2025
         file name: ~user/test.txt
          modified: YES
         user name: user   host name: localhost
        process ID: 12345 (still running)
While opening file "test.txt"
             dated: Mon Jan 25 09:50:00 2025

(1) Another program may 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" to recover the changes (see :help recovery).
    If you did this already, delete the swap file ".test.txt.swp" to avoid this message.

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

選項決策指南

鍵動作適用場景
R / r恢復:從 .swp 恢復未保存修改確認原進程已結束、需要找回修改內容
D / d刪除:刪除 .swp 文件,正常編輯確認不需要恢復內容、或已手動備份、或原進程仍在運行但你要強制接管
E / e仍編輯:忽略 .swp,直接編輯當前磁碟版本原進程仍在運行,你只想查看/複製內容,不保存修改
O / o只讀打開:以只讀模式打開磁碟版本原進程仍在運行,你只需參考內容
Q / q退出:放棄打開不確定情況,先退出排查
A / a中止:同退出,但腳本中可捕獲腳本調用 Vim 時

手動清理 .swp 文件(批量/腳本化)

單文件清理


# 確認原進程不存在
ps -ef | grep vim | grep test.txt
# 或
lsof /path/to/test.txt

# 刪除
rm -f /path/to/.test.txt.swp

批量掃描清理(定時任務/巡檢腳本)


#!/bin/bash
# cleanup_swp.sh: 清理超過 24 小時的 .swp 文件 (避免誤刪正在編輯的)
TARGET_DIRS=("/home" "/opt" "/data" "/tmp")
MAX_AGE_HOURS=24

for dir in "${TARGET_DIRS[@]}"; do
    find "$dir" -name "*.swp" -type f -mmin +$((MAX_AGE_HOURS * 60)) -exec ls -lh {} \; 2>/dev/null | \
    while read perms links owner group size month day time file; do
        # 額外檢查: 原文件是否被進程打開
        orig_file="${file%.swp}"
        orig_file="${orig_file#.}"  # 去掉開頭的 .
        if ! lsof "$orig_file" >/dev/null 2>&1; then
            echo "清理孤立 swap: $file (原文件: $orig_file)"
            rm -f "$file"
        else
            echo "跳過活躍 swap: $file (原文件正在被編輯)"
        fi
    done
done

一鍵清理當前目錄下所有 .swp


find . -name "*.swp" -type f -delete
# 或顯式確認
find . -name "*.swp" -type f -exec rm -iv {} +

恢復未保存修改(.swp 恢復流程)


# 方法一: Vim 內建恢復 (推薦)
vim -r test.txt
# 或打開文件時選 R

# 方法二: 手動提取 (不啟動 Vim 界面)
vim -r -c "wq" test.txt  # 直接恢復並保存退出

# 方法三: 使用 vim 專用恢復工具 (極少見)
# 從 .swp 導出純文本 (需解析二進制格式, 非標準)

預防配置:減少 .swp 干擾與數據丟失

1. 修改 Swap 文件存儲目錄(集中管理,避免污染項目目錄)


# ~/.vimrc
set directory=~/.vim/swap//
# 雙斜線 // 表示文件名包含完整路徑編碼,避免同名文件衝突
# 需預先創建目錄
mkdir -p ~/.vim/swap

2. 縮短更新間隔(減少數據丟失窗口)


# ~/.vimrc
set updatetime=1000      # 1 秒無操作寫入 swap (預設 4000ms)
set updatecount=100      # 每 100 字符寫入 swap (預設 200)

3. 啟用持久化撤銷(比 swap 更強大)


# ~/.vimrc
set undofile
set undodir=~/.vim/undo//
mkdir -p ~/.vim/undo
# :w 後仍可用 u 撤銷歷史修改,跨會話生效

4. 自動保存草稿(插件/腳本)


# 使用 auto-save 插件或
au CursorHold,CursorHoldI * silent! update
# 正常模式/插入模式停頓時自動 :update (僅修改時寫入)

Swap 文件 vs Swap 分區/交換空間:概念區分

概念用途管理命令關鍵特征
Vim .swp 交換文件編輯器會話崩潰恢復`rm .file.swp`, `vim -r`用戶級、文件級、臨時、文本編輯專用
系統 Swap 分區/文件虛擬記憶體擴展 (物理 RAM 不足時換頁)`swapon`, `swapoff`, `mkswap`, `free`, `vmstat`系統級、塊設備/文件、持久、內核管理

本文討論的是 **Vim 編輯器交換文件 (.swp)**,非系統交換空間。系統 Swap 管理請參考 `swapon -s`、`/etc/fstab`、`vm.swappiness` 等。

容器/遠程環境特殊處理

  • 容器:容器內編輯文件產生 .swp 在容器層,容器銷毀隨之消失。掛載卷編輯則在宿主機卷上產生 .swp。
  • SSH 遠程編輯:斷開連接導致 .swp 殘留。重連後同用戶打開同文件會提示恢復。
  • 多用戶共享文件:不同用戶編輯同文件會產生各自 .swp(文件名含用戶信息),互不干擾但需協調保存順序。

Vim swap文件示意圖

Vim .swp 文件是編輯器崩潰恢復的安全網,也是項目目錄常見的「垃圾文件」來源。建立「異常中斷必恢復、正常結束自動清理、集中存儲目錄、持久化撤銷替代、定期巡檢清理」完整管理體系,配合 `:wa` 肌肉記憶(頻繁保存所有修改),將編輯風險降至最低。運維巡檢腳本納入孤立 .swp 掃描清理,開發規範強制 `set directory` 集中管理,讓交換文件隱形護航而不成雜物。

Copyright © Windows教程網 All Rights Reserved