Linux上で特殊文字を含む名前のファイルの削除方法

はじめに

コマンドの操作ミスやスクリプト出力の文字化けなどで特殊文字を含む名前でファイルができてしまい、単にrmコマンドでは削除できない時の削除方法。

いざという時のためにメモ。

実験用のファイル

temp $ ls
"ccc.txt    -bbb.txt    aaa.txt
temp $

他にもありえますが用意するのがめんどくさかったのと、今回の削除方法はファイル名によらず使えるのでこれで。

実験

とりあえず用意したファイルを普通に消そうとするとどうなるか見てみます。

先頭がダブルクォートのファイル名

temp $ rm "ccc.txt
>
temp $

次の入力を待たれてしまいます。

先頭がハイフンのファイル名

temp $ rm -bbb.txt
rm: illegal option -- b
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file
temp $ 

rmコマンドのオプションと解釈されてしまいます。

解決方法

いろいろなやり方があるのですが、汎用的な方法を。

手順1 ls -iでinode番号を確認

temp $ ls -i
2991451 "ccc.txt    2991471 -bbb.txt    2991475 aaa.txt
temp $

ファイル名の前に表示されているのがinode番号です。

手順2 確認したinode番号を指定して削除

temp $ rm `find . -inum 2991451`
temp $ ls
-bbb.txt    aaa.txt
temp $ rm `find . -inum 2991471`
temp $ ls
aaa.txt
temp $

削除できました。

実際にやる場合は、事前の削除対象の確認を忘れずに。

おまけ

実験用に使ったパターンのものは別の方法でも削除できます。

先頭がダブルクォートのファイル名

2つ方法があります。

  • ファイル名のダブルクォートをエスケープする
    • rm ¥"ccc.txt
  • ファイル名をダブルクォートで囲んでファイル名のダブルクォートをエスケープする
    • rm "¥"ccc.txt"

先頭がハイフンのファイル名

こちらは、ダブルクォートの方法では消せないので以下の方法を使います。

  • コマンドのオプションに--を指定する
    • rm -- -bbb.txt