「rm -rf でも削除できない!」 「Permission deniedって出るけど、sudoでもダメ…」 「Device or resource busyって何?」
こんな経験はありませんか?
Linuxでディレクトリが削除できない時、実は様々な原因が潜んでいます。 権限の問題だけでなく、ファイルが使用中だったり、特殊な属性が設定されていたり…
この記事では、ディレクトリが削除できないあらゆる原因と、その解決方法を実例付きで解説します。 もう削除できないディレクトリに悩まされることはありません!
まず試す!基本的な削除コマンド

rmdir:空のディレクトリを削除
# 空のディレクトリのみ削除可能
rmdir ディレクトリ名
# 例
rmdir empty_folder
# エラーが出る場合
rmdir: failed to remove 'folder': Directory not empty
# → ディレクトリが空でない
rm -r:ディレクトリを再帰的に削除
# ディレクトリとその中身をすべて削除
rm -r ディレクトリ名
# 確認メッセージを表示
rm -ri ディレクトリ名
# 強制的に削除(確認なし)
rm -rf ディレクトリ名
# より詳細な情報を表示しながら削除
rm -rfv ディレクトリ名
⚠️ 注意:rm -rf は非常に危険!
# 絶対にやってはいけない例
rm -rf / # システム全体を削除
rm -rf /* # 同上
rm -rf ~ # ホームディレクトリ全削除
原因1:権限不足(Permission denied)
症状と確認方法
$ rm -rf test_dir
rm: cannot remove 'test_dir': Permission denied
# 権限を確認
ls -la
drwxr-xr-x 2 root root 4096 Jan 15 10:00 test_dir
# 所有者がrootになっている!
解決方法
方法1:sudoを使う
sudo rm -rf test_dir
方法2:所有者を変更してから削除
# 所有者を自分に変更
sudo chown -R $(whoami):$(whoami) test_dir
# その後削除
rm -rf test_dir
方法3:権限を変更してから削除
# 書き込み権限を追加
sudo chmod -R 777 test_dir
# 削除
rm -rf test_dir
原因2:ファイルが使用中(Device or resource busy)
症状と確認方法
$ rm -rf /mnt/data
rm: cannot remove '/mnt/data': Device or resource busy
# どのプロセスが使用しているか確認
lsof +D /mnt/data
# または
fuser -v /mnt/data
解決方法
方法1:使用中のプロセスを終了
# プロセスを特定
lsof +D /path/to/directory
# 出力例
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1234 user cwd DIR 8,1 4096 12345 /path/to/directory
# プロセスを終了
kill 1234
# 強制終了が必要な場合
kill -9 1234
# その後削除
rm -rf /path/to/directory
方法2:マウントポイントの場合
# マウント状態を確認
mount | grep /mnt/data
# アンマウント
umount /mnt/data
# 強制アンマウント
umount -f /mnt/data
# lazy アンマウント(使用が終わったら自動的にアンマウント)
umount -l /mnt/data
# その後削除
rm -rf /mnt/data
方法3:カレントディレクトリの場合
# 現在そのディレクトリにいる場合
$ pwd
/home/user/target_dir
# 別のディレクトリに移動
cd ..
# 削除
rm -rf target_dir
原因3:特殊な属性(immutable属性)
症状と確認方法
$ sudo rm -rf protected_dir
rm: cannot remove 'protected_dir': Operation not permitted
# 属性を確認
lsattr protected_dir
----i--------e-- protected_dir/file
# 'i' = immutable(変更不可)属性が設定されている
解決方法
# immutable属性を解除(rootで実行)
sudo chattr -R -i protected_dir
# append-only属性も解除
sudo chattr -R -a protected_dir
# すべての特殊属性を解除
sudo chattr -R -iadAcSs protected_dir
# その後削除
sudo rm -rf protected_dir
よく見る属性の意味
# 属性の確認
lsattr -a ディレクトリ名
# 属性の意味:
# i : immutable(変更不可)
# a : append only(追記のみ可)
# d : no dump(dumpコマンドでバックアップされない)
# A : no atime updates(アクセス時刻を更新しない)
# S : synchronous updates(同期的に更新)
原因4:ファイル名に特殊文字が含まれる

症状と問題のあるファイル名
# スペースを含むディレクトリ
rm -rf my directory # エラー
# 特殊文字を含むディレクトリ
rm -rf dir*name # ワイルドカードとして解釈される
rm -rf dir-name # ハイフンがオプションと解釈される可能性
解決方法
方法1:クォートで囲む
# シングルクォート
rm -rf 'my directory'
rm -rf 'dir*name'
# ダブルクォート
rm -rf "my directory"
# エスケープ
rm -rf my\ directory
方法2:–を使用(オプション終了を明示)
# ハイフンで始まるディレクトリ
rm -rf -- -dirname
rm -rf -- --test
方法3:絶対パスまたは相対パスで指定
# 現在のディレクトリのファイル
rm -rf ./-dirname
rm -rf ./special*name
方法4:iノード番号で削除
# iノード番号を確認
ls -li
12345678 drwxr-xr-x 2 user user 4096 Jan 15 10:00 難しい★名前
# findでiノード番号を指定して削除
find . -inum 12345678 -exec rm -rf {} \;
原因5:ファイルシステムの問題
読み取り専用でマウントされている
# エラー
rm: cannot remove 'file': Read-only file system
# マウント状態を確認
mount | grep " ro,"
# 読み書き可能で再マウント
sudo mount -o remount,rw /mount/point
# その後削除
rm -rf directory
ファイルシステムのエラー
# ファイルシステムのチェック(アンマウント状態で実行)
sudo fsck /dev/sda1
# 強制チェック
sudo fsck -f /dev/sda1
# 自動修復
sudo fsck -y /dev/sda1
原因6:SELinuxやAppArmorの制限
SELinuxの確認と対処
# SELinuxの状態確認
getenforce
# 一時的に無効化
sudo setenforce 0
# ディレクトリ削除を試す
rm -rf directory
# SELinuxを元に戻す
sudo setenforce 1
# SELinuxコンテキストの確認
ls -Z directory
AppArmorの確認と対処
# AppArmorの状態確認
sudo aa-status
# 一時的に無効化
sudo systemctl stop apparmor
# 削除を試す
rm -rf directory
# AppArmorを再開
sudo systemctl start apparmor
原因7:NFSやネットワークドライブの問題
NFSのstaleファイルハンドル
# エラー
rm: cannot remove 'directory': Stale file handle
# NFSを再マウント
sudo umount -f /nfs/mount
sudo mount -t nfs server:/path /nfs/mount
# または、NFSサービスを再起動
sudo systemctl restart nfs-client.target
最終手段:強制削除のテクニック
方法1:親ディレクトリごと削除して再作成
# 問題のディレクトリが /home/user/work/problem の場合
cd /home/user
mv work work_old
mkdir work
# 必要なファイルだけwork_oldからworkにコピー
cp -r work_old/needed_files work/
# 後でwork_oldを削除試行
sudo rm -rf work_old
方法2:findとxargsで削除
# より強力な削除
find directory -type f -exec rm -f {} \;
find directory -type d -empty -delete
# xargsを使用
find directory -print0 | xargs -0 rm -rf
方法3:Perlワンライナー
# Perlで強制削除
perl -e 'use File::Path; rmtree("directory")'
方法4:Pythonで削除
python3 -c "import shutil; shutil.rmtree('directory', ignore_errors=True)"
削除前の安全確認チェックリスト
削除前に必ず確認!
# 1. 本当に削除して良いか確認
ls -la directory
# 2. 中身を確認
tree directory
# または
find directory -type f | head -20
# 3. バックアップを取る
tar czf backup_$(date +%Y%m%d).tar.gz directory
# 4. 削除コマンドを確認(echoで事前確認)
echo rm -rf directory
# 5. pwdで現在地を確認
pwd
トラブルシューティングフローチャート

ディレクトリが削除できない
↓
[Permission denied?]
Yes → sudo rm -rf
No ↓
[Device or resource busy?]
Yes → lsof/fuser で確認 → プロセス終了 or umount
No ↓
[Operation not permitted?]
Yes → lsattr で確認 → chattr -i
No ↓
[特殊文字を含む?]
Yes → クォートで囲む or iノード削除
No ↓
[Read-only file system?]
Yes → remount,rw
No ↓
最終手段を試す
よくある質問(FAQ)
Q1:rm -rf /* を実行してしまったら?
A:すぐにCtrl+Cで中断!
# プロセスを即座に停止
Ctrl+C
# システムが起動している場合、重要なデータをバックアップ
# その後、システムの復旧や再インストールを検討
Q2:削除したディレクトリを復元できる?
A:ext3/ext4なら可能性あり
# extundelete をインストール
sudo apt install extundelete
# 復元を試みる(アンマウント状態で)
sudo extundelete /dev/sda1 --restore-directory /path/to/deleted/dir
Q3:大量のファイルがあるディレクトリが削除できない
A:段階的に削除
# ファイルを先に削除
find directory -type f -delete
# 空のディレクトリを削除
find directory -type d -empty -delete
# または、rsyncを使った高速削除
mkdir empty_dir
rsync -a --delete empty_dir/ directory/
rmdir empty_dir directory
Q4:「Argument list too long」エラーが出る
A:findやxargsを使用
# × これはエラーになる
rm -rf /path/to/dir/*
# ○ これならOK
find /path/to/dir -mindepth 1 -delete
# または
find /path/to/dir -mindepth 1 -print0 | xargs -0 rm -rf
安全な削除のベストプラクティス
削除前の習慣
# 1. aliasで保護
echo "alias rm='rm -i'" >> ~/.bashrc
# 2. ゴミ箱コマンドを使用
sudo apt install trash-cli
trash-put directory # 削除の代わりに
# 3. 削除スクリプトを作成
#!/bin/bash
# safe_delete.sh
TARGET=$1
BACKUP_DIR="/tmp/deleted_$(date +%Y%m%d_%H%M%S)"
echo "バックアップ中: $TARGET → $BACKUP_DIR"
cp -r "$TARGET" "$BACKUP_DIR"
echo "削除中: $TARGET"
rm -rf "$TARGET"
echo "バックアップは $BACKUP_DIR にあります"
まとめ:削除できない時の解決手順
ディレクトリが削除できない時の対処法をまとめます:
基本の確認手順:
- 🔑 権限確認 →
sudo rm -rf
- 📂 使用状況 →
lsof
/fuser
- 🔒 属性確認 →
lsattr
/chattr
- 📝 特殊文字 → クォートで囲む
原因別の解決コマンド:
# 権限問題
sudo rm -rf directory
# 使用中
lsof +D directory
kill -9 [PID]
# 特殊属性
sudo chattr -R -i directory
# 特殊文字
rm -rf './strange name'
それでもダメなら:
- ファイルシステムチェック
- SELinux/AppArmor確認
- 再起動してから削除
安全のために:
- 削除前にバックアップ
- pwdで現在地確認
- trash-cliの使用を検討
これらの方法を順番に試せば、99%のディレクトリは削除できるはずです。 安全に、確実に、ディレクトリを管理しましょう!
コメント