Linuxで削除できないファイルをrmコマンドで削除する方法|ハイフンやスペース付きファイルの対処法


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ディレクトリ・ファイル操作 > Linuxで削除できないファイルをrmコマンドで削除する方法|ハイフンやスペース付きファイルの対処法
「rm コマンドでファイルを削除しようとしたら、オプションエラーが出て消せない」
「ファイル名にスペースやハイフンが入っていて、どう指定すればいいか分からない」
Linuxでは、ファイル名に特殊な文字(ハイフン、スペース、記号など)が含まれていると、通常の rm コマンドでは削除できないことがあります。

この記事では、通常の方法では削除できないファイルを安全に削除する方法を解説します。ハイフンで始まるファイル、スペースを含むファイル、さらに「Permission denied」や「Directory not empty」など、削除時によくあるエラーの対処法まで、実務で困らない知識をまとめました。

1. ハイフン(-)で始まるファイルを削除する

ファイル名がハイフン(-)で始まっていると、rm コマンドがファイル名をオプションとして解釈してしまい、エラーになります。

# rm -file.txt rm: invalid option -- 'l' Try 'rm ./-file.txt' to remove the file '-file.txt'.

対処法は2つあります。

方法1:「--」(ダブルハイフン)を使う

-- は「これ以降の文字列はオプションではない」とシェルに伝える特別な記号です。

# ls -file.txt # rm -- -file.txt # ls # (削除された)

方法2:「./」(ドットスラッシュ)を付ける

ファイル名の先頭に ./(カレントディレクトリの意味)を付けると、ハイフンがファイル名の一部として正しく認識されます。

# rm ./-file.txt

どちらの方法でも削除できますが、-- の方が汎用的で、他のコマンド(cpmv など)でも同じように使えるため覚えておくと便利です。

2. スペースを含むファイルを削除する

ファイル名にスペースが含まれていると、シェルがスペースで区切って複数のファイル名と解釈してしまいます。

# rm This is file.txt rm: cannot remove 'This': No such file or directory rm: cannot remove 'is': No such file or directory rm: cannot remove 'file.txt': No such file or directory

対処法は2つあります。

方法1:クォーテーションで囲む

ファイル名全体をダブルクォーテーション(")またはシングルクォーテーション(')で囲みます。

# rm "This is file.txt"

方法2:バックスラッシュでエスケープする

スペースの前にバックスラッシュ(\)を付けて、スペースを「ファイル名の一部」としてエスケープします。

# rm This\ is\ file.txt

※Tabキーによるファイル名補完を使うと、自動的にバックスラッシュが挿入されるため便利です。

3. 記号・特殊文字を含むファイルを削除する

*(アスタリスク)、?!# などのメタ文字(シェルが特別に解釈する文字)がファイル名に含まれている場合も、クォーテーションまたはバックスラッシュで対処します。

# ファイル名に * が含まれる場合 # rm 'report*.txt' # ファイル名に ! が含まれる場合 # rm 'important!.log' # ファイル名に # が含まれる場合 # rm '#temp#'

メタ文字を含むファイル名を扱う場合は、シングルクォーテーション(')で囲むのが最も安全です。ダブルクォーテーションでは一部の特殊文字($`!)が展開されてしまう場合があります。

4. 【実務Tips】inode番号を使って削除する(最終手段)

ファイル名が文字化けして正しく入力できない場合や、制御文字が含まれている場合は、ファイルの inode番号(ファイルシステムが内部で管理する識別番号)を使って削除する方法があります。

# まずinode番号を確認する # ls -li total 4 1234567 -rw-r--r-- 1 root root 100 3月 9 10:00 ?????.txt # inode番号を指定してfindで削除する # find . -inum 1234567 -delete

ls -li の一番左に表示される数字がinode番号です。find コマンドの -inum オプションでこの番号を指定すれば、ファイル名に関係なく確実に削除できます。

「Permission denied」で削除できない場合

# rm important.log rm: cannot remove 'important.log': Permission denied

このエラーは、ファイルやそのディレクトリに対する書き込み権限がない場合に発生します。

まず権限を確認する:ls -la important.log でファイルの所有者と権限を確認します
root権限で削除する:sudo rm important.log を実行します
それでも削除できない場合:ファイルに不変属性(immutable attribute)が設定されている可能性があります

# 不変属性を確認する # lsattr important.log ----i----------- important.log ← 「i」が不変属性 # 不変属性を解除してから削除する # chattr -i important.log # rm important.log

「Directory not empty」で削除できない場合

# rmdir old_backup/ rmdir: failed to remove 'old_backup/': Directory not empty

rmdir は空のディレクトリしか削除できません。中にファイルがあるディレクトリを削除するには rm -r(再帰削除)を使います。

# rm -r old_backup/

【要注意】rm -rf は確認なしに再帰的にすべてを削除します。本番環境では必ず削除対象を ls で事前確認してから実行してください。特に rm -rf /rm -rf * は取り返しのつかない事故につながるため、絶対にパスを間違えないよう細心の注意が必要です。

本記事のまとめ

削除できないケース 対処コマンド
ハイフン(-)で始まるファイル rm -- -ファイル名 または rm ./-ファイル名
スペースを含むファイル rm "ファイル 名" または rm ファイル\ 名
記号・特殊文字を含むファイル rm 'ファイル名'(シングルクォーテーション)
文字化けして入力できないファイル find . -inum inode番号 -delete
Permission deniedで削除できない sudo rm ファイル名 / chattr -i で属性解除
ディレクトリが空でない rm -r ディレクトリ名

ファイル操作やコマンドのミスで、冷や汗をかいた経験はありませんか?

rm コマンドの誤操作は、本番環境のデータを一瞬で消し去る致命的な事故に直結します。「なんとなく」でコマンドを打つのではなく、正しい知識で安全に操作することが重要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・MIMEでエンコードされたテキストを読めるように変換する
・viエディタで文字をコピーする
・ハードディスクの使用状況を調べるには
・tar.bz2ファイルの解凍・圧縮コマンド|tar.gzとの違いやオプション一覧
・tar.gz形式のファイルを解凍、展開するには

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る