はじめに

サーバーの運用保守では、SSHなどを介してCUI (コマンドラインインターフェース) のみで作業することが頻繁にあります。その際、ファイルの編集ではvi/vim エディタを使用することになります。
普段 VS Code を使っていると使い勝手の悪さに、苦労することも多いでしょう。
加えて、vi/vim はその独特な操作体系から、使い方を誤ると予期せぬデータ消失や意図しない変更を引き起こしてしまう可能性も秘めています。

「ファイルの中身が消えた??」「なんかファイルがぐちゃぐちゃに…」といった経験は、vi/vimユーザーなら一度はヒヤリとしたことがあるかもしれません。

この記事では、初心者がやりがちな落とし穴、特に注意が必要なvi/vimの「リスクの高いコマンド」をピックアップし、実際にどのような挙動をするのかを検証した結果を交えながら、うっかりミスを防ぐための知識を共有します。

目次:この記事で検証する主なコマンド

  • :%s/.../g: 全体置換(ファイル全体を一括変更、意図せぬ大規模変更リスク)
  • ビジュアルモード + d/c: 選択範囲の削除・変更(意図せず広範囲を選択してしまうリスク)
  • :%d: 全行削除(ファイル内容が完全に消えるリスク)
  • dG / dgg: カーソル位置からの削除(ファイル端までの広範囲削除リスク)
  • :w!: 強制書き込み(読み取り専用属性や変更衝突を無視するリスク)
  • :q!: 強制終了(保存されていない変更を警告なしに全て破棄するリスク)
  • :e!: 変更取り消し(保存されていない変更を全て破棄し最終保存状態へ戻すリスク)
  • :!外部コマンド: 外部コマンド実行(rm など危険なシェルコマンド実行リスク)
  • view モードのバイパス: 読み取り専用モードの迂回(:w!:set noreadonly で保護を無効化)

以下のファイルにこれらのコマンドを試していきます。

01
02
03
04
05
06
07
08
09
10
テスト用ファイル1行目
テスト用ファイル2行目
テスト用ファイル3行目
テスト用ファイル4行目
テスト用ファイル5行目
テスト用ファイル6行目
テスト用ファイル7行目
テスト用ファイル8行目
テスト用ファイル9行目
テスト用ファイル10行目

それでは、具体的なコマンドとその挙動を見ていきましょう。

1. 広範囲・ファイル全体に影響するコマンド

これらのコマンドは、一度に多くのテキストを変更するため、タイプミスや勘違いが大きな影響を及ぼします。

:%s/パターン/置換文字列/g (全体置換)

ファイル全体の「パターン」に一致する文字列を「置換文字列」に一括で置き換える強力なコマンドです。

リスク: パターンや置換文字列の指定を間違えると、意図しない大量の変更が発生し、元に戻すのが困難になる場合があります(特にアンドゥ機能が限定的な vi の場合)。

検証結果:
:%s/テスト/TEST/g
テストTESTに置換するコマンドを実行


ビジュアルモードでの広範囲選択 + d/c (広範囲削除/変更)

v(文字選択)、V(行選択)、Ctrl+V(矩形選択)でテキストを選択し、dで削除、cで変更できます。

リスク: 意図したよりも広い範囲を選択してしまい、dc を押した瞬間に大量のテキストが消えたり、変更モードになったりします。

検証結果:
V で 2行選択し d を実行。選択行が消えた。


:%d (全行削除)

% はファイル全体(1,$ と同義)を示し、d は行削除のコマンドです。つまり、このコマンドはファイル内のすべての行を削除します。

リスク: ファイルの内容が完全に失われます。タイプミスで意図せず実行してしまう可能性もあり、非常に危険です。空のファイルにするつもりがなければ、絶対に実行してはいけません。

検証結果:
:%d を実行。ファイルの内容がすべて消えた。


dG / dgg (カーソル位置からファイル末尾/先頭まで削除)

ノーマルモードで使うコマンドです。
* dG: カーソル行からファイルの最終行までを削除します (G が最終行へ移動)。
* dgg: カーソル行からファイルの最初の行までを削除します (gg が最初の行へ移動)。

リスク: カーソル位置によってはファイルの大部分が削除されます。特にファイルの先頭や末尾付近で意図せず実行すると、広範囲のデータが失われます。

検証結果:
2行目にカーソルを置き dG を実行。2行目以降がすべて削除された。

ファイルを復元し、2行目にカーソルを置き dgg を実行。1行目と2行目が削除された。

カーソル位置を意識しないと思わぬ範囲を消してしまう。dd (1行削除) と打ち間違える可能性も?

2. ファイルの上書き・終了に関するコマンド

保存や終了の際の強制オプション(!)は特に注意が必要です。

:w! (強制書き込み)

ファイルのパーミッションが読み取り専用になっていたり、外部で変更が加えられていたりする場合でも、強制的に現在のバッファ内容でファイルを上書きします。

リスク: 重要な変更履歴や、本来書き込むべきでないファイルを意図せず上書きしてしまう可能性があります。特に view(読み取り専用モード)で開いていても、ファイルシステム権限があれば 上書きできてしまう 点は重大なリスクです。

検証結果:
ファイルの書き込み権限を剥奪

編集後 :w で保存しようとするとエラーが出る

:w! を実行

書き込めた!

これは本当に危険。書き込み権限がないからと油断できない。

:q! (変更を破棄して強制終了)

バッファに保存されていない変更があっても、一切の警告なしに それらをすべて破棄してvimを終了します。

リスク: 必要な変更まで含めて、意図せず全ての変更内容を失う可能性があります。「保存したつもりだった」という勘違いと組み合わさると悲劇です。

検証結果:
編集後、:q!を実行

保存されていない

3. 外部コマンドの実行

vimの中からシェルコマンドを実行できる機能も、使い方によってはリスクがあります。

:!外部コマンド

vimを一時停止し、指定したシェルコマンドを実行します。

リスク: 実行するコマンド自体が危険な場合(例: rm -rf / など、絶対に実行しないでください!)、ファイルシステムに深刻なダメージを与える可能性があります。カレントディレクトリの確認不足もリスク要因です。

検証結果:
:!ls -lを実行。

カレントディレクトリのファイル一覧が表示された。

vim から離れずにちょっとした確認ができるのは便利だが、タイプミスで :!rm * などと打たないように細心の注意が必要。自信がないコマンドは実行しない。

4. view (読み取り専用モード) の過信は禁物

view コマンドや vim -R はファイルを読み取り専用モードで開くため、安全だと思いがちですが、完全ではありません。

リスク: 前述の :w! コマンドや、 :set noreadonly コマンドで読み取り専用モードを解除できてしまうため、「view だから絶対に書き込まれない」とは限りません。

検証結果:
view でファイルを開く

ファイルを編集し、w!で保存

保存されている!

viewコマンドの意味が薄れる瞬間。

安全な vi/vim 操作のために

日々の操作で事故を防ぐために、以下の点を心がけることをお勧めします。

  • こまめに保存する (:w): 大きな変更をする前や、一区切りついたときに保存する癖をつけましょう。
  • コマンドの意味を理解してから使う: 特に広範囲に影響するコマンドや ! 付きのコマンドは、実行前にマニュアル (:help command_name) を確認するなどしましょう。
  • バックアップを取る: 重要なファイルをviで開く際は、確認するだけだとしても cpコマンドなどでバックアップを作成しましょう。
  • バージョン管理システム (Gitなど) を利用する: 変更履歴を管理し、問題発生時に特定の状態に戻せるようにすることは非常に有効です。
  • :! でコマンドを実行する際は慎重に: 実行するコマンドとカレントディレクトリをよく確認しましょう。

おわりに

実際にこれらのコマンドを安全な環境で試してみることで、ドキュメントを読むだけでは得られない「怖さ」や「挙動」を体感できました。
vi/vim は非常に奥が深く、効率的なテキスト編集を実現してくれる素晴らしいツールです。そのパワーを安全に享受するためにも、リスクのあるコマンドとその挙動を理解しておくことは非常に重要です。