Vim – 保存できないファイルを強制保存する方法【tee/sudoコマンド】

midSun31midSun31
IT・デジタル

読取専用のファイルをうっかりsudoを付けずに開いて編集してしまった場合など、編集後に保存できないことに気づくケースってありますよね。しまった、と思っても再度開きなおして同じ内容を再編集するのは面倒です。そのような時は強制保存してしまいましょう。

この記事では、Vimエディタにおいて保存できないファイルを強制保存する方法を解説します。Vimのバージョンは8.1、OSはLinuxのUbuntuを利用しています。

また、sudoコマンドが使えるユーザーで操作する必要がありますのでご注意ください。

Vimでファイルを保存できない時の例

例えば、root権限のread_only.txtを一般ユーザー権限でvimで開いたと想定します。

「:wq」コマンドで保存しようとすると、以下のようにそのままでは保存できない旨のエラーが表示されます。

上記のエラーは書き込み権限がないファイルを編集して保存しようとしているため、上書き保存ができません。

方法1: teeコマンドで保存する

強制的に保存するには、Linuxのコマンド「tee」コマンドを用いる方法があります。特別なプラグインの追加は必要はありません。

読み取り専用のread_only.txtをvimコマンドで開いて編集します。以下のコマンドを実行します。

:w !sudo tee % > /dev/null

コマンドがやや長いので、それぞれのコマンドについて解説します。

  • :w
    • 内容を保存するコマンドです。
  • ! sudo tee
    • 上記のようにすることで「:w」の内容を「!」~以降で受け取ることができます。また、「!」を付けるとVimエディタで通常のLinuxのコマンドが実行できるようになります。
    • 「tee」が上書き保存なので、sudo権限で上書き保存するコマンドになります。
  • %
    • 現在のファイル名です。
  • > /dev/null
    • teeした内容を破棄しています。省略することもできますが、省略するとteeの内容がすべて標準端末に出力されることになります。

ファイルが更新される警告メッセージが表示されますが「O」を入力して続行します。

teeコマンドが実行できると、カーソルは元のファイルに戻るので「:q!」コマンドでVimを終了します。

該当のファイルが更新されていることがわかります。

方法1: sudoで開いて保存する

Vim上でsudoコマンドを使ってファイルを開いて強制保存することもできます。

ただし、Vim上でsudoコマンドを使うには、Vimのプラグイン「sudo.vim」の導入が必要です。

sudo.vimを追加する

  1. sudo.vimを『公式ページ』からダウンロードします。
  2. ダウンロードしたスクリプトをVimのプラグインのディレクトリに配置します。プラグインディレクトリは次のとおりです。
    ~/.vim/plugin
    • 当該ファイルが存在しない場合は新しく作成する必要があります。
      $ mkdir ~/.vim/plugin
    • 「.vim」ディレクトリの場所を忘れてしまった場合は「vim –version」コマンドを実行すると表示されます。

sudoで強制保存する

sudo.vimのプラグインが追加できたら強制保存してみましょう。読み取り専用のread_only.txtをvimコマンドで開いて編集します。

  1. Vimのコマンドラインで次のコマンドを実行します。
    :w sudo:%
    • 上記が「:w」で保存する内容をsudo権限で開いた同名のファイルに保存するコマンドになります。

  2. ファイルが更新される旨、警告メッセージが表示されますが「O」を入力してEnterキーを押します。
  3. 再度Enterキーを押します。

以上でsudo.vimによる強制保存は完了です。ファイルを確認すると更新されていることが確認できます。

以上、Vimで保存できないファイルを強制保存する方法でした。

IT・デジタル
Howpon[ハウポン]

コメント