vi の .swp ファイルが rm *.swp で消せないときの対処法

vi で編集すると swp ファイルが生成されるが、何かの拍子に編集中の vi が落ちると swp が残ってしまう。

swp ファイル名は . から始まるので rm *.swp では消せない。 * では . から始まるファイル名にマッチしないためだ。

. から始まるファイルを消すには、明示的にパターンの先頭に . を含める必要がある。つまり、以下のように指定すれば良い。

1rm .*.swp 

念のため確認しながら消したければ、 rm -i .*.swp のように rm の -i オプションを指定すればよい。

経験上、この削除方法を知ってはいたが、その根拠を調べたことがなかったので、マニュアルを確認してみた。

bashマニュアルの Pathname Expansion に以下が記載されていた。

When a pattern is used for pathname expansion, the character '.' at the start of a name or immediately following a slash must be matched explicitly, unless the shell option dotglob is set. In order to match the filenames '.' and '..', the pattern must begin with '.' (for example, '.?''), even if dotglob is set.

(翻訳結果)
パターンがパス名展開に使われる場合、名前の先頭やスラッシュの直後にある文字「.」を一致させるには、明示的に「.」をパターンに含めなければなりません。 ただし、シェルオプション dotglob オプションが有効であれば、この制約は適用されません。 ファイル名「.」および「..」に一致させるには、たとえ dotglob が有効でも、パターンは「.」で始まる必要があります(例: .?)。 シェルオプション globskipdots が有効であれば、たとえパターンが「.」で始まっていても、ファイル名「.」および「..」は一致しません。

ファイル名が . から始まる場合の実行例と dotglob について、以下リンク先に載せておく。

  1. パス名展開(Pathname Expansion)
  2. dotglob

関連ページ