rmコマンドはファイルやディレクトリを削除するコマンドだ。
Linuxを使う上で、ファイルやディレクトリの削除は頻繁に行う作業だが、重要なファイルを誤って削除して痛い目にあったという方は多いのではないだろうか?
このページではrmコマンドについて詳しくまとめた。オプションを使いこなすと、 誤操作は減って、結果として作業が早くなっていくはずだ。
Linuxを使うエンジニアは参考にして頂ければと思う。
rmコマンドの基本
rmコマンドの基本動作
rmコマンドは「remove」の略で、削除のコマンドだ。ファイルやディレクトリを削除する。
基本的な書式は次のようになる。
$ rm ファイル名
rmに続き、ファイル名を指定するだけでよい。
例えば、カレントディレクトリのtest01.datを削除する場合は、次のようになる。
$ rm test01.dat
test01.datが削除された。
上記rmコマンドを試すなら下のコマンドをLinux上で実行すればすぐに再現可能だ。以下も同様だが、rm * による削除には注意すること!
1 2 3 4 5 6 7 |
touch test01.dat touch test02.dat touch test03.dat clear ls rm test01.dat ls |
複数ファイルの削除
すべてのファイルを消したいときは、
$ rm *
とする。*はワイルドカードだ。後ほどご説明する。ここでは全部を表していると思ってもらえればいいだろう。
すべてのファイルが削除された。
1 2 3 4 5 6 7 8 |
rm -r * touch test01.dat touch test02.dat touch test03.dat clear ls rm * ls |
追記2016/06/09: * ではドットファイルは対象にならない。
ファイル名の一部を指定して削除する
*は、「なんらかの文字列」という意味のワイルドカードである。ワイルドカードは他の文字と組み合わせ、パターンを一致させて使うこともできる。
たとえば、「test『なんとか』.dat」というファイルのみを一度に削除したい場合は、
rm test*.dat
と指定すればよい。
「test『なんとか』.dat」のみ削除され、「sample『なんとか』.dat」は削除されなかった。
1 2 3 4 5 6 7 8 9 10 11 |
rm -r * for i in `seq 1 20` do touch test$i.dat done touch sample01.dat touch sample02.dat clear ls rm test*.dat ls |
また、?は「なんらかの一文字」という意味のワイルドカードである。
「test1.dat」から「test20.dat」の20ファイルの中から、「test10.dat」から「test19.dat」の10ファイルだけを削除したい場合は、「test1『なんらかの一文字』.dat」となるので、
rm test1?.dat
と指定する。
「test10.dat」から「test19.dat」のファイルのみが削除された。
1 2 3 4 5 6 7 8 9 |
rm -r * for i in `seq 1 20` do touch test$i.dat done clear ls rm test1?.dat ls |
rmコマンドの便利なオプションたち
rmコマンドのオプション一覧
後から詳細をご紹介するが、まずは一覧で見てみよう。
-f, --force
エラーメッセージを表示しない
-i
ファイルの削除前に確認する
-I
削除の対象が4つ以上の場合のみ削除の確認をする
-r, -R
ディレクトリも削除の対象とする
-v
削除の詳細表示
それぞれ詳細を紹介していく。
-fオプション(--force):エラーメッセージを表示しない
もしも、指定したファイルが存在しない場合やディレクトリを削除しようとした場合、警告メッセージが表示される。
これを表示しない場合は、-fまたは--forceオプションを指定する。
$ rm -f ファイル名
ファイルが存在しない場合、-fオプションを付けなければエラーが表示されるが、-fオプションが付いていればエラーを表示しない。
1 2 3 4 5 6 7 8 9 |
rm -r * touch test01.dat touch test02.dat touch test03.dat clear ls rm test10.dat ls rm -f test10.dat |
-iオプション(--interactive):ファイルの削除前に確認する
削除するとファイルが消えてしまい、元に戻せない。そのため、ファイルの削除前に念のため確認をしたいときもあるだろう。
そういったときは-iオプションを使用する。
$ rm -i ファイル名
「rm: 通常の空ファイル `ファイル名' を削除しますか? 」という確認が表示されるので、「y」または「Y」を入力するとファイルが消える。
もしも、消したくない場合は「y」か「Y」以外を入力する。何も入力せずEnterでも構わない。
複数ファイルを削除対象とした場合、1ファイルごとに確認が表示される。
1ファイルごと削除する前に確認がされる。
1 2 3 4 5 6 7 8 |
rm -r * touch test01.dat touch test02.dat touch test03.dat clear ls rm -i *.dat ls |
-Iオプション(--Interactive):削除の対象が4つ以上の場合のみ削除の確認をする
オプションの小文字の-iと大文字の-Iでは挙動が違う。
複数のファイルを一度に削除する場合、確認のために-iオプションを付与すると何度も確認が必要になる。
-Iオプションを付与することで、もしも削除の対象が4つ以上の場合のみ削除の確認を行う。
$ rm -I ファイル群
該当するファイル数が3つの場合は確認されない。
該当するファイル数が4つになると確認される。
1 2 3 4 5 6 7 8 9 |
rm -r * touch test01.dat touch test02.dat touch test03.dat touch test04.dat clear ls rm -I *.dat ls |
-rオプション(--recursive):ディレクトリも削除の対象とする
rmコマンドは、オプションを設定しなければ、ディレクトリを削除の対象としない。
ディレクトリも削除の対象とする場合は、-rオプションを指定する。
$ rm -r ディレクトリ名
実際-rを付けていない場合を試してみよう。
オプションがない場合は、ディレクトリは削除されていない続いて-rオプションを付与した場合を試してみる。
-rオプションを付けた場合は、ディレクトリは削除される
1 2 3 4 5 6 7 8 9 10 |
rm -r * touch test01.dat touch test02.dat touch test03.dat mkdir data cp * ./data clear ls rm -r * ls |
-vオプション(--verbose):削除の詳細表示
どのファイルやディレクトリが削除されたかを表示する。削除した内容が記録されているのでログや削除の証拠として残すことができる。
$ rm -v ファイル名
削除の内容が表示された。
1 2 3 4 5 6 7 8 |
rm -r * touch test01.dat touch test02.dat touch test03.dat clear ls rm -v * ls |
複数のオプションの指定
オプションは複数同時に指定できる。
例えば、ディレクトリを含めた削除を確認しながら行い記録も残したい場合は、-vriと複数のオプションを並べて入力する。
$ rm -vri *
1ファイルを削除する毎に確認が出て、削除後に結果が表示される。
ディレクトリ内の削除をするのかの確認、ディレクトリ内のファイルも同様に1ファイル毎に確認と結果の表示がされる。
1 2 3 4 5 6 7 8 9 10 11 |
rm -r * mkdir data touch test01.dat touch test02.dat touch ./data/osaka.dat touch ./data/nagoya.dat clear ls ls ./data/ rm rm -vri * ls |
その他のオプション
その他のオプション一覧
利用するシチュエーションは限られるので、使用頻度は低いが、次のようなオプションも用意されている。
--interactive=never
削除の確認を行わない
--one-file-system
マウントされたディレクトリは削除の対象にせずスキップする
--no-preserve-root
ルートディレクトリ自体の削除を許可する
--preserve-root
ルートディレクトリ自体の削除を許可しない
--interactive=neverオプション:削除の確認を行わない
削除の確認は行わない。特にオプションを指定しなければこのオプションが初期設定であるのであえて指定することはないだろう。
$ rm --interactive=never ファイル名
削除の確認が行われず削除された。
1 2 3 4 5 6 7 8 |
rm -v * touch test01.dat touch test02.dat touch test03.dat clear ls rm --interactive=never * ls |
--one-file-systemオプション:マウントされたディレクトリは削除の対象にせずスキップする
例えばchrootを用意する等、あるディレクトリに重要なルートディレクトリをマウントする場合がある。
この場合、意識せずに削除の操作をすると重要なルートディレクトリを削除してしまうことになりかねない。
このオプションは、そのようなマウントされているディレクトリの削除は行わずにスキップする。
$ rm --one-file-system *
--no-preserve-rootオプション:ルートディレクトリ自体の削除を許可する
ルートディレクトリ自体の削除を許可する。つまりすべてのファイル、ディレクトリを削除対象とする。
非常に危険なオプションであるため、通常は使用しないし、実験したければ仮想マシン内で実施しよう。
$ rm --no-preserve-root *
--preserve-rootオプション:ルートディレクトリ自体の削除を許可しない
ルートディレクトリ自体の削除を許可しない。rmコマンドは誤ってルートディレクトリを削除しないように初期設定でこのオプションの設定になっているので、あえて指定するオプションではない。
$ rm --preserve-root *
オプションと同じ名前のファイルを削除する場合
「-iv」のようなオプションと同じ名前がファイル名やディレクトリ名に指定する場合は、現在のディレクトリを表す「./」を付与する。
$ rm ./-iv
ファイル名-ivでは、ファイル-ivは削除されない。ファイル名に./を付与し./-iv とすることで削除された。
1 2 3 4 5 6 7 8 |
rm -r * touch ./-iv clear ls rm -iv ls rm ./-iv ls |
また、「rm -- -iv」 のように--を付けると後ろのオプションはオプションとして機能しなくなる。こちらの方法でも削除は可能だ。
rmコマンドと類似のコマンド群
最後にrmコマンドに関連して、基本的なファイル操作のコマンドも紹介しておく。
cpコマンド
copyコマンドだ。ファイルを削除する前に必要に応じてファイルはバックアップする。
mvコマンド
moveで移動のコマンドだ。copyコマンド同様、必要に応じて削除前にファイルを退避しておく。
詳細はリンク先にまとめているのでそちらも確認してほしい。
まとめ
ファイルを削除する操作は日々行うことになるが、意識をしないと必要なファイルを消してしまう可能性もある。
rmコマンドは慎重な操作が必要だ。各種オプションを知っているだけで防げるミスもあるはずだ。
rmコマンド操作前には、今一度、動作を確認してみよう。
* ではドットファイルは対象にならない(そもそもシェルの機能なのでrmの解説とは関係ありませんが)。
-で始まるファイルの削除は -- の後はオプションとして解釈されないという機能も利用できます。(rm -- -iv など)
この方法はgetoptなどの標準的な関数でオプションを解析しているプログラムで一般的に利用できます。
とても参考になるコメントありがとうございます。本文に反映させていただきます。
また、--への変換も気がつきつつも、置いておいたものですので、対応させていただきます。
すみません、投稿時に- - (ハイフン 2つ連続) がロングダッシュ -- に置き換えられてしまったようです。