今回はLinuxコマンドであるrmコマンドについて解説します
rmコマンドは、ファイルやディレクトリを削除するコマンドです
不要なログや作業ファイルの片付けなど毎日のように使う一方で、使い方を間違えると大事なファイルを一瞬で失ってしまうコマンドでもあるので、安全な使い方とセットでぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
rmコマンドとは??
rmコマンドは、指定したファイルやディレクトリを削除するコマンドです
名前は「remove(取り除く)」の略です
オプションなしではファイルだけを削除し、ディレクトリを削除するには-rや-dオプションが必要です
Windowsやデスクトップ環境のような「ゴミ箱」はなく、rmで削除したファイルは基本的に元に戻せません
この記事の実行結果は、GNU coreutils 9.4のrm(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています
rmコマンドの主なオプション
rmコマンドの主なオプションは次のとおりです
| オプション | 意味 |
|---|---|
| -i (–interactive) | ファイルを1つ削除するたびに「削除しますか?」と確認するオプション |
| -I | 4つ以上のファイルを削除するときと、ディレクトリを再帰的に削除するときに、最初に1回だけ確認するオプション |
| -f (–force) | 存在しないファイルを指定してもエラーを出さず、確認もせずに削除するオプション |
| -r, -R (–recursive) | 削除対象が4つ以上の場合のみ削除の確認をする |
| -d (–dir) | 空のディレクトリを削除するオプション |
| -v (–verbose) | 削除したファイルやディレクトリの名前を1つずつ表示するオプション |
| –preserve-root | /(ルートディレクトリ)を再帰的に削除しようとしたときに、削除を拒否するオプション |
ここからは、テスト用のディレクトリrm-testの中に練習用のファイルを作って説明します
削除するコマンドなので、必ずこのテスト用ディレクトリの中で試してください
mkdir△rm-test
cd△rm-test
# メッセージを英語で表示する(この記事の実行結果と同じ表示にするため)
export△LC_ALL=C
printf△”meeting△at△10:00\n”△>△memo.txt
printf△”sales△report△2026-10\n”△>△report.txt
touch△a.txt△b.txt△c.txt△d.txt△e.txt
mkdir△-p△proj/src△proj/docs△emptydir
printf△”echo△hello\n”△>△proj/src/hello.sh
printf△”project△docs\n”△>△proj/docs/readme.txt
touch△-d△”2026-11-01△10:00″△memo.txt△report.txt△a.txt△b.txt△c.txt△d.txt△e.txt△proj/src/hello.sh△proj/docs/readme.txt
touch△-d△”2026-11-01△10:00″△proj/src△proj/docs△proj△emptydir
# 作成したディレクトリの構成を確認する
ls△-lR
実行結果:
.:
total 16
-rw-rw-r– 1 user user 0 Nov 1 10:00 a.txt
-rw-rw-r– 1 user user 0 Nov 1 10:00 b.txt
-rw-rw-r– 1 user user 0 Nov 1 10:00 c.txt
-rw-rw-r– 1 user user 0 Nov 1 10:00 d.txt
-rw-rw-r– 1 user user 0 Nov 1 10:00 e.txt
drwxrwxr-x 2 user user 4096 Nov 1 10:00 emptydir
-rw-rw-r– 1 user user 17 Nov 1 10:00 memo.txt
drwxrwxr-x 4 user user 4096 Nov 1 10:00 proj
-rw-rw-r– 1 user user 21 Nov 1 10:00 report.txt
./emptydir:
total 0
./proj:
total 8
drwxrwxr-x 2 user user 4096 Nov 1 10:00 docs
drwxrwxr-x 2 user user 4096 Nov 1 10:00 src
./proj/docs:
total 4
-rw-rw-r– 1 user user 13 Nov 1 10:00 readme.txt
./proj/src:
total 4
-rw-rw-r– 1 user user 11 Nov 1 10:00 hello.sh
# ファイルの中身を確認する
cat△memo.txt
実行結果:
meeting at 10:00
cat△report.txt
実行結果:
sales report 2026-10
cat△proj/src/hello.sh
実行結果:
echo hello
cat△proj/docs/readme.txt
実行結果:
project docs
以降のコマンドは、すべてrm-testの中で実行します
export△LC_ALL=Cを実行しない日本語の環境では、確認メッセージやエラーメッセージが日本語で表示されます
-i (–interactive)
ファイルを1つ削除するたびに「削除しますか?」と確認するオプションです
yを入力するとファイルが削除され、nを入力すると削除されずに残ります
rm△-i△a.txt△b.txt
実行結果:
rm: remove regular empty file ‘a.txt’? y
rm: remove regular empty file ‘b.txt’? n
# a.txtにはy、b.txtにはnと入力しています
ls
実行結果:
b.txt c.txt d.txt e.txt emptydir memo.txt proj report.txt
# a.txtだけが削除され、b.txtは残っています
-I
4つ以上のファイルを削除するときと、ディレクトリを再帰的に削除するときに、最初に1回だけ確認するオプションです
-iのように1ファイルずつ聞かれないので、大量の誤削除を防ぎつつ手間も少ないのが特徴です(GNU版のオプションで、–interactive=onceと同じ意味です)
# 削除するファイルが3つ以下のときは確認されない
rm△-I△c.txt△d.txt△e.txt
# 事前準備:4つのファイルを作る
touch△f1.txt△f2.txt△f3.txt△f4.txt
# 4つ以上のときは最初に1回だけ確認される
rm△-I△f1.txt△f2.txt△f3.txt△f4.txt
実行結果:
rm: remove 4 arguments? n
# nと入力したので、4つとも削除されずに残ります
# ディレクトリを再帰的に削除するときも確認される
rm△-rI△proj
実行結果:
rm: remove 1 argument recursively? n
# nと入力したので、projは残ります(yと入力すると、projが中身ごと削除されます)
# 練習用のファイルを削除する
rm△f1.txt△f2.txt△f3.txt△f4.txt
-f (–force)
存在しないファイルを指定してもエラーを出さず、確認もせずに削除するオプションです
書き込み禁止のファイルでも確認なしで削除してしまうので、使うときは対象をよく確認しましょう
# 存在しないファイルを指定するとエラーになる
rm△nofile.txt
実行結果:
rm: cannot remove ‘nofile.txt’: No such file or directory
# -fを付けるとエラーが出ない
rm△-f△nofile.txt
echo△$?
実行結果:
0
# 終了ステータスも0(成功)になるので、スクリプトの後片付けなどで使われます
-r, -R (–recursive)
ディレクトリを、中のファイルやサブディレクトリごとまとめて削除するオプションです
-rと-Rは同じ意味で、オプションなしでディレクトリを指定するとエラーになります
# オプションなしでディレクトリを指定するとエラーになる
rm△proj
実行結果:
rm: cannot remove ‘proj’: Is a directory
# 削除する前に、中身を確認する
ls△-R△proj
実行結果:
proj:
docs src
proj/docs:
readme.txt
proj/src:
hello.sh
# ディレクトリを中身ごと削除する
rm△-r△proj
ls
実行結果:
b.txt emptydir memo.txt report.txt
# projが中身ごと削除されています
# ※rm -rは確認なしでディレクトリの中身ごと削除し、元に戻せません。必ずテスト用ディレクトリの中で試してください
# ※-rfと組み合わせると確認もエラー表示もなくなるので、パスの書き間違いに特に注意してください
-d (–dir)
空のディレクトリを削除するオプションです
中にファイルがあるディレクトリは削除されずにエラーになるので、-rより安全です
# 空のディレクトリを削除する
rm△-d△emptydir
# 事前準備:ファイルの入ったディレクトリを作る
mkdir△dir1
touch△dir1/file.txt
# 中身があるディレクトリはエラーになる
rm△-d△dir1
実行結果:
rm: cannot remove ‘dir1’: Directory not empty
-v (–verbose)
削除したファイルやディレクトリの名前を1つずつ表示するオプションです
何が削除されたのかを記録に残したいときや、-rで削除した中身を確認したいときに便利です
rm△-v△memo.txt△report.txt
実行結果:
removed ‘memo.txt’
removed ‘report.txt’
# -rと組み合わせて、ディレクトリの中身ごと削除する
rm△-rv△dir1
実行結果:
removed ‘dir1/file.txt’
removed directory ‘dir1’
# 中のファイルが先に削除され、最後にディレクトリが削除されます
# ※rm -rは確認なしでディレクトリの中身ごと削除し、元に戻せません。必ずテスト用ディレクトリの中で試してください
–preserve-root
/(ルートディレクトリ)を再帰的に削除しようとしたときに、削除を拒否するオプションです
GNU版のrmでは最初から有効になっているので、付けなくても動きます
# GNU版のrmでは–preserve-rootが既定で有効なので、rm -r / のように / を指定すると、何も削除せずにエラーで止まります
# ただし、rm -rf /* のように * で / の中身を指定した場合は守られません
# 保護を外す –no-preserve-root は絶対に使わないでください
# ※システム全体が壊れるので、この記事ではこれらのコマンドは実行していません
基本的な使い方
rmコマンドの基本的な構文は「rm△オプション△ファイル名」です
ファイル名をスペースで区切って並べると、複数のファイルをまとめて削除できます
削除に成功したときは何も表示されないので、lsで消えたことを確認しましょう
# ファイルを1つ削除する
rm△b.txt
# 事前準備:削除するファイルを作る
touch△note1.txt△note2.txt
# 複数のファイルをまとめて削除する
rm△note1.txt△note2.txt
ls△-A
# 何も表示されなければ、すべて削除できています
ワイルドカードでまとめて削除する
*(任意の文字列)などのワイルドカードを使うと、名前のパターンに合うファイルをまとめて削除できます
ワイルドカードはrmではなくシェルがファイル名に展開するので、削除する前に同じパターンをlsやechoで確認する習慣をつけましょう
# 事前準備:練習用のファイルを作る
touch△app.tmp△cache.tmp△data.txt
# 削除する前に、パターンに合うファイルを確認する
ls△*.tmp
実行結果:
app.tmp cache.tmp
# echoを付けると、実際に実行されるコマンドがわかる
echo△rm△*.tmp
実行結果:
rm app.tmp cache.tmp
# 確認できたら削除する
rm△-v△*.tmp
実行結果:
removed ‘app.tmp’
removed ‘cache.tmp’
ls
実行結果:
data.txt
# ※rm * .tmp のように*の後ろに空白が入ると、ディレクトリ内のすべてのファイルが削除されてしまうので注意してください
# 練習用のファイルを削除する
rm△data.txt
特殊な名前のファイルを削除する
ハイフンで始まるファイル名
「-file.txt」のようにハイフンで始まるファイル名は、そのまま指定するとオプションと間違えられてしまいます
「–」の後に書くか、「./」を付けて指定すると削除できます
# 事前準備:ハイフンで始まるファイルを作る
touch△–△-file.txt△-old.txt
ls
実行結果:
-file.txt -old.txt
# そのまま指定するとオプションと間違えられる
rm△-file.txt
実行結果:
rm: invalid option — ‘l’
Try ‘rm ./-file.txt’ to remove the file ‘-file.txt’.
Try ‘rm –help’ for more information.
# -file.txtが「-f -i -l -e …」というオプションとして読まれ、-lは存在しないのでエラーになります
# rm自身が「rm ./-file.txt」と書くように教えてくれています
# –の後に書くと、ファイル名として扱われる
rm△–△-file.txt
# ./を付けても削除できる
rm△./-old.txt
ls△-A
スペースを含むファイル名
「my△file.txt」のようにスペースを含むファイル名は、そのまま書くと「my」と「file.txt」の2つのファイルとして扱われます
ダブルクォート(”)で囲むか、スペースの前に\を付けて指定しましょう
# 事前準備:スペースを含むファイルを作る
touch△”my△file.txt”
# そのまま指定すると、2つの別のファイルとして扱われる
rm△my△file.txt
実行結果:
rm: cannot remove ‘my’: No such file or directory
rm: cannot remove ‘file.txt’: No such file or directory
# 同じ名前のmyやfile.txtが存在すると、そちらが削除されてしまうので注意してください
# ダブルクォートで囲んで指定する
rm△”my△file.txt”
ls△-A
書き込み禁止のファイルを削除するときの確認
書き込み権限のないファイルを削除しようとすると、オプションを付けていなくても「write-protected(書き込み禁止)」の確認メッセージが出ます
これは標準入力が端末のときだけの動きで、-fを付けたときや、cronなどから端末なしで実行したときは確認されずに削除されます
# 事前準備:書き込み禁止のファイルを作る
echo△”secret”△>△readonly.txt
touch△-d△”2026-11-01△10:00″△readonly.txt
chmod△444△readonly.txt
ls△-l△readonly.txt
実行結果:
-r–r–r– 1 user user 7 Nov 1 10:00 readonly.txt
# 削除しようとすると確認される
rm△readonly.txt
実行結果:
rm: remove write-protected regular file ‘readonly.txt’? n
# nと入力したので削除されません(yと入力すると削除されます)
# -fを付けると確認なしで削除される
rm△-f△readonly.txt
ls△-A
ちなみに、ファイルを削除できるかどうかは、ファイル自体の権限ではなく、ファイルが入っているディレクトリの書き込み権限で決まります
そのため、書き込み禁止のファイルでも、ディレクトリに書き込み権限があれば削除できてしまいます
ディレクトリを削除するときのrmとrmdirの違い
ディレクトリの削除には、rmのほかにrmdirコマンドも使えます
rmdirとrm△-dは空のディレクトリだけを削除し、rm△-rは中身ごと削除します
「空のはずのディレクトリ」を消すときは、rmdirを使うと中身が残っていたときにエラーで止まってくれるので安心です
# 事前準備:空のディレクトリと、中身のあるディレクトリを作る
mkdir△emptydir
mkdir△-p△backup/old
touch△backup/old/a.log
# 空のディレクトリはrmdirで削除できる
rmdir△emptydir
# 中身があるとrmdirもrm -dもエラーになる
rmdir△backup
実行結果:
rmdir: failed to remove ‘backup’: Directory not empty
rm△-d△backup
実行結果:
rm: cannot remove ‘backup’: Directory not empty
# 中身ごと削除するにはrm -rを使う
rm△-r△backup
# ※rm -rは確認なしでディレクトリの中身ごと削除し、元に戻せません。必ずテスト用ディレクトリの中で試してください
findと組み合わせて古いファイルを削除する
findコマンドと組み合わせると、「○日より古いログだけを削除する」といった条件付きの削除ができます
いきなり削除せず、まずは同じ条件で一覧を表示して、対象のファイルを確認してから削除しましょう
ここでは実行日によって結果が変わらないように、touch△-dでファイルの日時を固定し、-newermtで「2026-10-01より前」という日付を指定しています
# 事前準備:日時の違うログファイルを作る
mkdir△logs
touch△-d△”2026-08-01△10:00″△logs/app-20260801.log
touch△-d△”2026-09-01△10:00″△logs/app-20260901.log
touch△-d△”2026-10-15△10:00″△logs/app-20261015.log
touch△-d△”2026-11-01△10:00″△logs/app-20261101.log
ls△-l△logs
実行結果:
total 0
-rw-rw-r– 1 user user 0 Aug 1 10:00 app-20260801.log
-rw-rw-r– 1 user user 0 Sep 1 10:00 app-20260901.log
-rw-rw-r– 1 user user 0 Oct 15 10:00 app-20261015.log
-rw-rw-r– 1 user user 0 Nov 1 10:00 app-20261101.log
# 2026-10-01より前に更新されたファイルを確認する
find△logs△-name△”*.log”△!△-newermt△”2026-10-01″△|△sort
実行結果:
logs/app-20260801.log
logs/app-20260901.log
# 確認できたら、同じ条件で削除する
find△logs△-name△”*.log”△!△-newermt△”2026-10-01″△-delete
ls△-l△logs
実行結果:
total 0
-rw-rw-r– 1 user user 0 Oct 15 10:00 app-20261015.log
-rw-rw-r– 1 user user 0 Nov 1 10:00 app-20261101.log
# 古い2つのファイルだけが削除されています
# 練習用のディレクトリを削除する
rm△-r△logs
# ※rm -rは確認なしでディレクトリの中身ごと削除し、元に戻せません。必ずテスト用ディレクトリの中で試してください
実際の運用では、「30日より前に更新されたファイル」を「-mtime△+30」のように、実行した日を基準にして指定することが多いです
-deleteの代わりに「-exec△rm△-v△{}△+」と書くと、削除したファイル名を表示しながらrmで削除できます
findコマンドの詳しい使い方は、記事の最後の関連記事で紹介しています
削除したファイルは元に戻せない
rmで削除したファイルは、ゴミ箱に移動されるのではなく、ディレクトリから名前が消されます
そのファイルを使っているプログラムや別の名前(ハードリンク)がなくなると、ディスク上の領域は再利用されるので、基本的に元に戻すことはできません
安全に削除するための習慣
誤削除を防ぐには、次のような習慣をつけておくと安心です
・削除する前にlsやechoで対象を確認する(ワイルドカードやfindを使うときは特に)
・慣れないうちは-iや-Iを付けて、確認してから削除する
・大事なファイルは、削除する前にcpでバックアップを取る
・rm△-rf△$DIR/のように変数を使うと、変数が空のときに「rm△-rf△/」になってしまうので、スクリプトでは変数が空でないか確認する
・sudo△rmは削除できる範囲がシステム全体に広がるので、パスを何度も確認してから実行する
いつも確認してほしい場合は、aliasで「rm」を「rm△-i」に置き換えておく方法もあります
# rmを実行すると、自動でrm -iになるようにする
alias△rm=’rm△-i’
alias△rm
実行結果:
alias rm=’rm -i’
# 設定を解除する
unalias△rm
# ターミナルを閉じると設定は消えるので、ずっと使いたい場合は~/.bashrcに書きます
トラブルシューティング
rmコマンドを使うときによく出るエラーと、その対処方法です
「Is a directory」エラーが出る
オプションなしでディレクトリを指定すると、このエラーになります
空のディレクトリならrm△-dかrmdir、中身ごと削除するならrm△-rを使いましょう
中身が残っていると、rm△-dやrmdirでは「Directory not empty」エラーになります
# 事前準備:ディレクトリを作る
mkdir△docs
rm△docs
実行結果:
rm: cannot remove ‘docs’: Is a directory
rm△-d△docs
# 空のディレクトリなので、-dで削除できます
「Permission denied」エラーが出る
ファイルが入っているディレクトリに書き込み権限がないと、このエラーになります
自分のディレクトリなら権限を戻してから削除し、システムのファイルの場合は本当に削除してよいか確認してからsudoを使いましょう
# 事前準備:書き込み禁止のディレクトリの中にファイルを作る
mkdir△locked
touch△locked/file.txt
chmod△555△locked
rm△locked/file.txt
実行結果:
rm: cannot remove ‘locked/file.txt’: Permission denied
# ファイル自体には書き込み権限がありますが、ディレクトリに書き込み権限がないので削除できません
# ディレクトリの権限を戻すと削除できる
chmod△755△locked
rm△-r△locked
# ※rm -rは確認なしでディレクトリの中身ごと削除し、元に戻せません。必ずテスト用ディレクトリの中で試してください
「Operation not permitted」エラーが出る
次のような場合は、権限があるように見えても「Operation not permitted」で削除できないことがあります
・chattr△+iで変更禁止(immutable)の属性が付いているファイル(lsattrで確認でき、rootでも削除できません)
・/tmpのようにスティッキービットが付いたディレクトリの中にある、他のユーザーのファイル
変更禁止の属性は、管理者が意図して付けていることが多いので、外す前に理由を確認しましょう
この2つは環境やroot権限が必要なため、この記事では実行していません
「Argument list too long」エラーが出る
ワイルドカードが展開されたファイル名が多すぎて、コマンドに渡せる長さの上限を超えるとこのエラーになります
このメッセージはrmではなくシェル(bash)が出していて、rmは実行されていません
findの-deleteやxargsを使うと、ファイルの数が多くても削除できます
# 事前準備:ファイルを10万個作る
mkdir△many
cd△many
seq△-f△”tmp_%06g.txt”△1△100000△|△xargs△touch
ls△|△wc△-l
実行結果:
100000
rm△*.txt
実行結果:
bash: /usr/bin/rm: Argument list too long
# /usr/bin/rmの部分は環境によって違うことがあります
# findの-deleteで削除する
cd△..
find△many△-name△”*.txt”△-delete
rmdir△many
# 中身がすべて削除できたので、rmdirでディレクトリも削除できます
まとめ
いかがでしたでしょうか
今回はrmコマンドについてまとめてみました
rmはファイルを削除するコマンドで、-rでディレクトリを中身ごと、-dで空のディレクトリを削除できます
削除したファイルは元に戻せないので、lsやechoで対象を確認してから実行し、慣れないうちは-iや-Iで確認しながら使うのがおすすめです
ハイフンやスペースを含むファイル名、大量のファイルの削除など、つまずきやすいポイントもあわせて押さえておきましょう
ぜひマスターしてください!
