こんにちは、インフラエンジニアのryuです。
今回は、Linuxでディレクトリを削除するときに使う rmdir と rm -r の違いを初心者向けに解説します。
Linuxでディレクトリを削除しようとして、
rmdir: failed to remove 'testdir': Directory not empty
と表示された経験はありませんか?
rmdir は便利ですが、空のディレクトリしか削除できません。
中にファイルやディレクトリがある場合は、用途に応じて rm -r などを使います。
ただし、rm -r は配下のファイルまでまとめて削除するため、使い方を間違えると大きな事故につながります。
また、元記事では「削除対象ディレクトリに書き込み権限が必要」「chmod 777 で権限を付ければよい」と説明していましたが、これは正確ではありません。
ディレクトリそのものを削除できるかどうかは、基本的にそのディレクトリを含む親ディレクトリ側の書き込み権限と実行権限が関係します。
この記事では、rmdir の基本から、-p、rm -r、権限エラー、削除前の確認方法まで順番に解説します。
rmdirは空のディレクトリを削除するコマンド¶
rmdir は、空のディレクトリを削除するコマンドです。
名前は、
remove directory
から来ています。
基本的な使い方は、
rmdir ディレクトリ名
です。
例えば、
rmdir testdir
と実行すると、空の testdir を削除できます。
絶対パスでも相対パスでも指定できます。
rmdir /home/user/testdir
または、
rmdir ./testdir
です。
実際にrmdirを使ってみる¶
まず削除用のディレクトリを作成します。
mkdir testdir
作成できたか確認します。
ls -la

次に、
rmdir testdir
を実行します。
その後、
ls -la
で確認します。

testdir が表示されなくなっていれば削除できています。
中身があるディレクトリはrmdirで削除できない¶
rmdir で特に重要なのが、
空ではないディレクトリは削除できない
という点です。
例えば、
mkdir testdir
touch testdir/test.txt
とします。
この状態で、
rmdir testdir
を実行すると、
rmdir: failed to remove 'testdir': Directory not empty
のようなエラーになります。
これは異常ではありません。
rmdir が、誤って中のファイルまで削除しないように動いているためです。
初心者のうちは、
空のディレクトリ → rmdir
と覚えておきましょう。
中身を確認してから削除する¶
削除前に、
ls -la testdir
で中身を確認します。
さらにサブディレクトリも含めて確認したいなら、
find testdir -maxdepth 2 -print
などを使えます。
「空だと思っていたけど設定ファイルが残っていた」ということもあります。
削除コマンドでは、
消す前に対象を確認する
習慣が非常に大切です。
空ではないディレクトリは rm -r¶
ディレクトリの中身ごと削除したい場合は、
rm -r testdir
を利用します。
-r は再帰的に処理するオプションです。
例えば、
testdir/
├── file1.txt
├── file2.txt
└── subdir/
└── file3.txt
というディレクトリに対して、
rm -r testdir
を実行すると、配下のファイルやサブディレクトリも含めて削除されます。
これは便利ですが、rmdirよりはるかに影響が大きいコマンドです。
削除対象を間違えないようにしてください。
詳しくはこちらの記事でも解説しています。
Linuxのrmコマンドの使い方解説!ファイルを削除する方法
rm -rf を安易に使わない¶
Linuxの解説記事を見ると、
rm -rf testdir
をよく見かけます。
-f は強制的に処理するオプションで、存在しないファイルなどに対する確認や一部のエラーを抑制します。
便利ですが、初心者のうちは何でも rm -rf で削除する癖を付けない方がよいでしょう。
例えば、
rm -rf /path/to/dir
でパスを間違えれば、多数のファイルを一度に失う可能性があります。
まずは、
ls -la 対象
や、
find 対象 -maxdepth 2 -print
で中身を確認し、削除対象が正しいことを確認してから実行しましょう。
rmdir -p で親ディレクトリも削除する¶
rmdir には -p / --parents オプションがあります。
例えば、
mkdir -p testdir/testdir1
とします。
この状態で、
rmdir -p testdir/testdir1
を実行すると、
testdir/testdir1
↓
testdir
の順に、空になった親ディレクトリも削除しようとします。
GNU Coreutilsの説明では、
rmdir -p a/b/c
は、おおまかに、
rmdir a/b/c
rmdir a/b
rmdir a
と順番に実行するような動作です。
親ディレクトリに別のファイルやディレクトリが残っていれば、そこで削除は失敗します。
-p の動きを実際に確認する¶
元記事の例と同じように、
mkdir -p testdir/testdir1
mkdir -p testdir/testdir2
とします。
確認すると、

のような構成になります。
まず、
rmdir testdir/testdir1
だけなら、testdir1 のみ削除されます。

この時点では testdir2 が残っているため、親の testdir は空ではありません。
続いて、
rmdir -p testdir/testdir2
を実行します。
testdir2 を削除すると testdir も空になるため、親ディレクトリまで削除できます。

rmdirでよく使うオプション¶
GNUの rmdir で代表的なオプションは次のとおりです。
| オプション | 意味 |
|---|---|
-p, --parents |
空になった親ディレクトリも順に削除する |
-v, --verbose |
削除に成功したディレクトリを表示する |
--ignore-fail-on-non-empty |
空でないことによる失敗を診断メッセージの対象外にする |
例えば、
rmdir -v testdir
とすると、削除した内容を表示できます。
ディレクトリを削除できる権限はどこを見る?¶
ここは元記事から大きく修正するポイントです。
元記事では、
「削除対象ディレクトリに書き込み権限 w が必要」
と説明していました。
しかし、Linuxでディレクトリエントリを削除できるかどうかは、基本的に親ディレクトリ側の権限が重要です。
例えば、
/home/user/
└── testdir/
という構成で testdir を削除する場合、testdir という名前を /home/user/ のディレクトリエントリから削除します。
そのため、基本的には親ディレクトリ /home/user/ に対して、
書き込み権限 w
実行権限 x
が必要です。
削除対象の testdir 自身に w が付いているかどうかだけでは判断できません。
chmod 777 を安易に使わない¶
元記事では、削除できない場合に、
chmod 777 testdir
を紹介していました。
これは推奨しません。
777 は、
所有者:読み・書き・実行
グループ:読み・書き・実行
その他:読み・書き・実行
という非常に広い権限です。
権限エラーが出たからといって、とりあえず 777 にするのはセキュリティ上よくありません。
まず、
ls -ld .
ls -ld ..
ls -ld testdir
などで、対象と親ディレクトリの所有者・権限を確認しましょう。
必要であれば所有者やグループ、適切な権限を見直します。
Linuxの権限についてはこちらで詳しく解説しています。
Linuxのファイル権限とは?chmodの数字・rwx・Permission deniedを解説
Permission denied が出る場合¶
例えば、
rmdir testdir
で、
Permission denied
と表示された場合は、親ディレクトリの権限を確認します。
ls -ld .
例えば、
dr-xr-xr-x
のように書き込み権限がなければ、そのディレクトリ配下の名前を削除できない可能性があります。
ただし、実際の削除可否には、
- 所有者
- グループ
- ACL
- sticky bit
- ファイルシステムの状態
なども影響します。
初心者のうちは、「削除対象自身のwだけを見るのではなく、親ディレクトリの権限を確認する」と覚えてください。
sticky bitがあるディレクトリ¶
/tmp のような共有ディレクトリでは、sticky bitが設定されていることがあります。
ls -ld /tmp
とすると、
drwxrwxrwt
のように最後が t になっています。
この場合、ディレクトリ自体は多くのユーザーが書き込めますが、他人が所有しているファイルやディレクトリを自由に削除できないよう制限されます。
「親ディレクトリに書き込み権限があるのに削除できない」という場合には、こうした仕組みも関係することがあります。
rmdir と rm -r の違い¶
違いをまとめると次のようになります。
| コマンド | 削除対象 |
|---|---|
rmdir dir |
空のディレクトリ |
rmdir -p a/b/c |
空のディレクトリと空になった親 |
rm -r dir |
中身があるディレクトリも含めて再帰削除 |
初心者には rmdir の方が安全です。
中身があれば削除を拒否してくれるためです。
一方、rm -r は中身ごと削除するので、実行前の確認が重要です。
削除ではなく残したまま空にしたい場合¶
例えば、
/var/app/cache/
というディレクトリそのものは残し、中身だけ整理したいケースもあります。
この場合は、ディレクトリそのものを rmdir するのではなく、必要なファイルだけを対象にします。
ただし、
rm -rf /var/app/cache/*
のようなコマンドは、隠しファイルを対象にしないなど思わぬ挙動もあるため、安易にコピーして使わないでください。
どのファイルを消したいのかを find や ls で確認してから削除する方が安全です。
findコマンドで空ディレクトリを探す¶
空のディレクトリを探したい場合は、
find . -type d -empty
を利用できます。
例えば、
./cache/old
./tmp/test
のように空ディレクトリを見つけられます。
削除前に一覧を確認し、
「本当に不要な空ディレクトリだけか」
を確認できます。
findコマンドについてはこちらの記事でも解説しています。
Linuxでファイル検索をする方法は?findコマンドの使い方を詳しく解説
Linuxの削除コマンドは実際に安全な環境で試す¶
rmdir や rm は、実際に使わないとなかなか違いを覚えられません。
例えばホームディレクトリ配下に練習用のディレクトリを作り、
mkdir -p ~/linux-practice/a/b
touch ~/linux-practice/a/test.txt
のようにして、
rmdir
rm -r
ls
find
の動きを確認すると理解しやすくなります。
InfraAcademyでは、Linuxコマンドをブラウザ上のターミナルで実行しながら学習できます。
本番サーバーで削除コマンドをいきなり試すのは危険なので、学習用環境でコマンドの動きを確認してから使うのがおすすめです。
Linuxでディレクトリを削除する方法まとめ¶
今回は、Linuxでディレクトリを削除する方法を解説しました。
空のディレクトリなら、
rmdir testdir
です。
親ディレクトリも空なら一緒に削除したい場合は、
rmdir -p parent/child
を利用できます。
中身があるディレクトリを削除するなら、
rm -r testdir
ですが、配下のファイルまで削除されるため注意してください。
また、削除権限で重要なのは、
削除対象のディレクトリ自身へ chmod 777 することではありません。
基本的には、親ディレクトリ側の書き込み・実行権限や所有者などを確認します。
削除系のコマンドでは、
対象を確認
↓
中身を確認
↓
権限を確認
↓
削除
という順番を習慣にしておきましょう。
あわせて読みたい



