UNIX/Linuxの部屋 コマンド:rm


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド rm ファイル・ディレクトリを削除する

最終更新


UNIX/Linux の rm コマンドは、ファイルやディレクトリを削除するコマンドである。rm コマンドは古くから存在するため (最初の UNIX である V1 で登場)、あらゆる UNIX/Linux 系 OS で使用可能である。


rm コマンドの基本的な使い方
% rm file
とすることで、file を消すことができる。
% rm file1 file2 file3 ...
だと、複数のファイルを削除する。もちろん
% rm *.txt
とファイルグロブ・ワイルドカードを使うこともできる。

ディレクトリを一括削除するには rm -r とする。
% rm -r dir/
パーミッションによる警告を抑止し、エラーメッセージも抑止して、消せるものはとにかく消す場合は rm -rf とする。
% rm -rf dir/

ディレクトリの削除
ディレクトリを rm コマンドで削除しようとすると、
% rm mydir
rm: mydir: is a directory
または
rm: cannot remove `mydir': ディレクトリです
などとエラーになる。

一般的には、ディレクトリの削除には rm コマンドではなく rmdir コマンドを使う。
% rmdir mydir
また、BSD 系の rm コマンドには -d オプションがあり、
% rm -d mydir
とすることでディレクトリを削除できる。ただし、rmdir コマンドも、rm -d も、ディレクトリが空でないと削除できない。

あるディレクトリ以下にファイルがあろうがなかろうがディレクトリごと全てを削除したい場合は
% rm -r mydir
とする。

なお、Linux で使用されている coreutils の rm について、JM ページのマニュアルでは
-d または --directory
ディレクトリが空で無くても、ディレクトリをunlinkする。 (スーパーユーザのみ使用可能)
とあるが、少なくとも 2005年には -d オプションは無視するようになっており、2010年頃に -d オプション自体が削除された模様である。

シンボリックリンクの削除と落とし穴【2017-10-25追記】
rm コマンドでシンボリックリンクを削除することができる。
% ln -s file mysymlink
% rm mysymlink
あくまで削除するのはシンボリックリンクであって、そのリンク先のファイル・ディレクトリには何も影響はない。

★以下 2017-10-25 追記。
ディレクトリを指しているシンボリックリンクがあるとして、シンボリックリンクだけを消すつもりで
% rm mysymlink
とすべきところを、誤って
% rm -rf mysymlink/
とすると、シンボリックリンクは消えず、リンク先のディレクトリが全部消えてしまう。「余計なスラッシュを付けない」「不用意に -rf オプションを付けない」というのが教訓であるが、unlink コマンドを使うという手もある。

unlink コマンドは、引数はひとつだけで、ファイル・シンボリックリンクの削除はできるが、ディレクトリの削除や、再帰的な削除はできない。内部的にはシステムコール unlink(2) を呼んでいるだけなので、unlink(2) でエラーになるものは全部削除できない (なお、ディレクトリを削除するシステムコールは rmdir(2) である)。

単一ファイルの削除の場合、rm コマンドではなく unlink コマンドを使うクセをつけておくとよいかもしれない。

ハードリンクしたファイルの削除
ハードリンクしたファイルを削除した場合どうなるかを下記に示す。
% touch sample.txt
→ sample.txt を作成し、
% ln sample.txt sample2.txt
→ ハードリンクで sample2.txt を作成
% ls -l
-rw-r--r-- 2 68user realuser 40 5 31 15:50 sample.txt
-rw-r--r-- 2 68user realuser 40 5 31 15:50 sample2.txt
→ sample.txt と sample2.txt は全く同じもの。第2カラムのリンク数が "2" となっている。
% rm sample2.txt
→ sample2.txt を削除すると
% ls -l
-rw-r--r-- 1 68user realuser 40 5 31 15:50 sample.txt
→ リンク数が 1つ減って 1 になる

rm コマンドのオプション一覧
-i 1つ1つのファイルについて本当に削除するか確認を求める
rm コマンドに -i オプションを付けると、
% rm -i file.txt
remove file.txt?

% rm -i file.txt
rm: remove 通常ファイル `file.txt'?
といったふうに、削除してよいかを確認してくる。y を入力すると削除するが、y 以外だと削除しない。

必要なファイルを消してしまわないかどうか不安な人は
% alias rm "rm -i' (csh・tcsh の場合)
% alias rm="rm -i" (sh・bash の場合)
と alias を設定しておくのも手だが、慣れてくるうちに
% \rm file.txt
などと alias を無効化してしまうのがクセになってしまい、肝心なときにも役に立たないというのは非常にありがちな話である。
-r 再帰的に指定ディレクトリ以下を削除する
-f パーミッションに関係なく全て削除する。
例えばパーミッションの「w」を落としたファイルを消そうとすると、
% chmod 444 file
% rm file
override r--r--r-- user/group for file?
のように、本当に消していいのか聞いてくる (y を押すと消去。それ以外のキーを押すと消さない)。-f オプションを付けると、このようなときにユーザに問い合わせることなく消去してしまう。もちろん他人のファイルなど、パーミッション的に削除できないものは -f オプションを付けても消すことはできない。

誤削除を防ぐために
rm コマンドで * や ? などのメタキャラクタを使う場合は、まず echo コマンドや ls コマンドで確認する癖を付けるとよい。
% rm *.txt
の前に
% echo *.txt
または
% ls *.txt
として、本当に消してもよいか確認しよう。例えば
% rm * .txt (誤って * と .txt の間に空白を入れてしまった)
とする前に
% ls * .txt
として確認すれば、
ls: .txt: No such file or directory
となって、誤りに気づくだろう。また、tcsh を使っているなら、シェル変数 rmstar を利用するのもよい。

ファイルを消せるかどうか
rm コマンドでファイルが削除できるかどうかは、本質的にはそのファイルが置かれているディレクトリにパーミッション「w」(書き込み) が立っているかどうか、で決まる。-f オプションの項で説明した
override r--r--r-- user/group for file?
というメッセージは、rm コマンドが確認のために聞いているだけである。詳しくは chmod コマンドのエントリを参照してほしい。

文字化けしたファイルの削除 【2017-07-04 追加】
文字化けしたファイルを削除したい場合、下記のように ? や * などのワイルドカードを使うとよい。
% ls -l
-rw-r--r-- 1 user group 0 Jul 4 13:43 abc???????
% rm abc*
すべて文字化けしている場合や、? や * ではうまく絞り込めない場合、
% ls -li
22327771 -rw-r--r-- 1 user group 0 Jul 4 13:43 ???????????????
として inode を確認した上で、下記のようにすれば削除したり、リネームしたりすることができる。
% find . -inum 22327771 -exec rm {} \;
→ 削除
% find . -inum 22327771 -delete
→ rm を使わず、delete オプションを使ってもよい。
find の -inum にて、削除ではなくリネームする例も記載しているので参考にしてほしい。

関連コマンド
BSD 系 UNIX で、どうしても消せないファイルがある場合は、ls -lo でファイルを見て、ファイルフラグが立っていないかどうか調べるとよい。ファイルフラグは chflags コマンドで設定できる。
>> Linuxオンラインマニュアル(man) Linux rm(1)
>> Solaris10オンラインマニュアル(man) Solaris10 rm(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD rm(1)

読み方 rm (UNIXコマンド) [あーる・えむ] [りむーぶ]

"ReMove" の略。


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説