「ファイル名にスペースやハイフンが入っていて、どう指定すればいいか分からない」
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'.
方法1:「--」(ダブルハイフン)を使う
-- は「これ以降の文字列はオプションではない」とシェルに伝える特別な記号です。# ls -file.txt # rm -- -file.txt # ls # (削除された)
方法2:「./」(ドットスラッシュ)を付ける
ファイル名の先頭に./(カレントディレクトリの意味)を付けると、ハイフンがファイル名の一部として正しく認識されます。# rm ./-file.txt
-- の方が汎用的で、他のコマンド(cp、mv など)でも同じように使えるため覚えておくと便利です。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
方法1:クォーテーションで囲む
ファイル名全体をダブルクォーテーション(")またはシングルクォーテーション(')で囲みます。# rm "This is file.txt"
方法2:バックスラッシュでエスケープする
スペースの前にバックスラッシュ(\)を付けて、スペースを「ファイル名の一部」としてエスケープします。# rm This\ is\ file.txt
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・MIMEでエンコードされたテキストを読めるように変換する
・viエディタで文字をコピーする
・ハードディスクの使用状況を調べるには
・tar.bz2ファイルの解凍・圧縮コマンド|tar.gzとの違いやオプション一覧
・tar.gz形式のファイルを解凍、展開するには
