りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

rm - 指定したファイルを削除する

f:id:ibuquicallig:20190906011608p:plain

この記事ではRaspberry Pi上でrmコマンドの基本的な使い方と例、オプションなどについて解説しています。

この記事でできること

  • rmコマンドを使用してファイルを削除することができるようになる。
  • ディレクトリ内のファイル・ディレクトリをまとめて一気に削除できるようになる。
  • 間違ってファイルを大事なファイルを削除してしまわないように確認を挟むようにする。

rm コマンド

rmコマンドで指定したファイルや(オプション次第で)ディレクトリを削除することができます。Windowsなどと異なり、このコマンドで削除したファイルをゴミ箱などから復元することはできません。

$ ls
backup.sh  image.png  memo.txt
$ rm image.png
$ ls
backup.sh memo.txt

非常に単純でめちゃくちゃよく使うLinuxコマンドTOP10には入るやつです!が、先ほども書いた通り何も警告もなしに大事なファイルを消してしまったり、範囲指定を間違えると大変なことになるので、じっくりと使い方を学んで、消してもいいファイルやディレクトリで純分練習してから使い始めましょう!

ファイルを削除する

まずは先ほど紹介した通り引数なしで実行します。rm [ファイ名] [別のファイル名] ...と指定することで複数のファイルを一度に削除することができます。

練習用に空のファイルを作りたい場合はtouchコマンドを使うと手早く作成できます。以下のコマンドで練習用のディレクトリと空のファイルを3つ作ってすべて消してみます。

$ mkdir practice          # practiceディレクトリを作成
$ cd practice             # ディレクトリを移動
$ touch file1 file2 file3 # ファイルを3つ作成
$ ls
file1 file2 file3

$ rm file1                # file1を削除
$ ls
file2 file3

$ rm file2 file3          # file2と3を削除
$ ls
# 何も表示されない(ファイルが全部消えた!)

このような感じで簡単にファイルをコマンドで削除することができます。ディレクトリを作成するコマンドのmkdirは以下の記事で詳しく紹介しています。

削除できるファイルは自分が編集権限を持っているファイルのみで例えば、別のユーザーが作成したファイルや、rootが作成したファイルは基本的には削除することができません。

今回は権限周りはあまり深く掘り下げるつもりはありませんが例を挙げておきます。ls -laコマンドでディレクトリ内のファイル一覧を表示したときに、左から3つ目の部分が今ログインしているユーザーと異なっている場合は削除できません。

/var/log/というディレクトリ内にはrootユーザーが作成したシステムのログがたくさん記録されています。それらのファイルを一般ユーザーが削除使用とすると、Permission deniedとなり削除することができません。

$ cd /var/log
$ ls -la syslog*
-rw-r----- 1 root adm 14266 Sep  3 00:17 syslog
-rw-r----- 1 root adm 18261 Sep  2 06:25 syslog.1
-rw-r----- 1 root adm  1618 Sep  1 06:25 syslog.2.gz
-rw-r----- 1 root adm  1668 Aug 31 06:25 syslog.3.gz
-rw-r----- 1 root adm  1686 Aug 30 06:25 syslog.4.gz
-rw-r----- 1 root adm  1728 Aug 29 06:25 syslog.5.gz
-rw-r----- 1 root adm  1691 Aug 28 06:25 syslog.6.gz
-rw-r----- 1 root adm  1677 Aug 27 06:25 syslog.7.gz

$ rm syslog.7.gz
rm: remove write-protected regular file 'syslog.7.gz'? y
rm: cannot remove 'syslog.7.gz': Permission denied

Raspberry Piで自分だけで開発している場合は、そもそもrootユーザーも使えるので削除できないファイルは最悪sudo rmで削除できていしまうので問題ないですが、Permission deniedと表示されたときは権限周りを調べてみてください。

複数ファイルを一括で削除する

先ほどのコマンドではファイル名を指定して複数削除していましたが、指定した文字列にマッチするファイルを削除というコマンドも実行できます。

指定するファイル名に*を追加すると複数マッチするファイルを一括で削除できます。以下を参考にしてください。

$ touch file1 file2 file3 txt1
$ ls
file1 file2 file3 txt1

$ rm file*
$ ls
txt1

file*と指定することでfileから始まるファイルを前方一致で纏めて削除するすることができます。後方一致で削除するには*.pngのようにすることで指定した拡張子のファイルなどをまとめて削除することができます。

$ ls
dog.png cat.jpg hamster.png

$ rm *.png
$ ls
cat.jpg

ファイル名に*だけを指定するとディレクトリ内のファイルをすべて削除します。雑ファイルがいっぱいあるときは便利ですが、大事なファイルも間違えて消してしまう可能性がとても高くなるので、なるべくこのような指定の仕方はやめたほうが無難です。また現在地のディレクトリと、削除したいディレクトリを勘違いしてしまい、現在地の消したらまずいファイルをすべて消してしまったという大惨事にもつながってしまいます(ファイル名を指定している場合はエラーで止まってくれる可能性があります)。

$ touch a b c d
$ ls
a b c d

$ rm *
$ ls
(何も表示されない)

-i オプションで削除前に確認を挟む

rm -iと実行することで本当に削除する前に確認を挟むことができます。

$ touch a
$ rm -i a
rm: remove regular empty file 'a'?
(そのままエンターキーを押す → 削除されない)

rm: remove regular empty file 'a'? y
(yやyesと入力してエンターキーを押す → 削除される)

確認(プロンプト)が挟まれたときに、そのままエンターキーを押すか、n / no と答えると削除されません。

後ほど普通にrmコマンドを実行したときに代わりにrm -iコマンドを実行するように設定します。不安であれば設定しておきましょう。

-r オプションでディレクトリとその中身を一気に削除する

-rrecursively再帰的にとよく出てきますが、ディレクトリの中の一切合切全部程度に覚えておくといいかもしれません。

例えばmeeting.txtcalc.xlsxという2つのファイルが存在しているmemo_2019というディレクトリが存在しています。そのディレクトリをディレクトリごと一度に削除することができるのがこのオプションです。

$ ls -R
./memo_2019:
calc.xlsx  meeting.txt

$ rm -r memo_2019
$ ls
(何も表示されない)

ディレクトリを削除するにはrmdirというコマンドが存在しているのですが、rm -rでも削除することができます。削除対象のディレクトリが空の場合でもディレクトリを削除することができます。

-f オプションでエラーや警告を無視して削除する

-fオプションを使用することでファイルやディレクトリが削除できなかった時に出力される文字列を抑制することができます。

シェル内で存在しないかもしれないファイルを削除するときにこのオプションを使用すると警告が表示されなくなるのでコンソール上が出力で埋め尽くされたりしなくなります。(そもそも削除対象のファイルの存在チェックを行うようにしましょう!(笑))

$ ls
a b c

$ rm d
rm: cannot remove 'd': No such file or directory

$ rm -f d
(何も表示されない)

ちなみに、この-fオプションをつけるとエラーが発生したときの終了コードも変わります。オプションありの場合はエラーがもし発生していたとしても0(正常終了)を返します。

$ ls
a b c

$ rm d
rm: cannot remove 'd': No such file or directory
$ echo $?
1

$ rm -f d
$ echo $?
0

ハイフン(-)で始まるファイルを削除するには

例えば-fというファイルを削除したいとき、正直にrm -fと実行すると-fオプションと認識されファイルを削除することができません。それを回避するためにrm --として実行します。

$ touch -- -f
$ ls
-f

$ rm -- -f
$ ls
(何も表示されない)

この--オプションですが、引数にファイル名をとるコマンドのほとんど(おそらくすべて?)に実装されています(touchmv‘など)。

そもそもそんなファイル名は作らないに越したことないのですが、間違えて作成してしまったときに役に立ちます。

削除時に確認を毎回挟むように設定する

上で紹介した-iオプションをrmコマンド実行時に必ず追加するようにします。いちいち打つのがめんどくさかったですが、こうすることでWindowsのように削除時に毎回確認を挟んでくれます。

コマンドのショートカットのようなもの(エイリアス)を作成するために、ホームディレクトリにある.bashrcというファイルを修正します。

以下の記事でもエイリアスについて解説しています。興味があったらこの記事の後に読んでみてください!

まずはホームディレクトリに移動して.bashrcファイルをエディタで開きます。vimを使っていきますがnanoemacsでも大丈夫です。Raspberry Piの場合(Raspbianの場合)最初からvimは使用可能です。

$ cd            # ホームディレクトリに移動
$ vim .bashrc

開いたファイルの末尾にrmrm -iにするエイリアスを作成します。vimの場合Shift + Gでファイルの末尾に移動することができます。

移動できたらiで編集モードに入り、以下の内容を追記します。

alias rm='rm -i'

追記できたらEscで入力モードから抜け、!wqで保存・Vimの終了をします。

.bashrcファイルの変更は次回ログイン以降、もしくは. .bashrcを実行することで有効となります。以下でコマンドを実行して動作確認するまでです。

$ . .bashrc
$ touch remove_test
$ ls r*
remove_test

$ rm remove_test
rm: remove regular empty file 'remove_test'? y

$ ls r*
ls: cannot access 'r*': No such file or directory

rmコマンドを実行しただけでrm -iを実行したことになっていますね!これで不用意な削除は防げそうです。

ちなみにエイリアスに設定した内容は対話的なコマンドライン上でのみ有効です。つまり、シェルスクリプト内の処理では無効となっているのでrmコマンドを実行すると-iオプションなしで実行されます。

だいぶファイル操作に慣れてきて、エイリアスを削除したくなったら先ほど.bashrcに追加した1行を削除して、ログインしなおすと無効化できます。

小ネタ

rootディレクトリを削除するとどうなる?

rm -rでディレクトリを削除することができるので、すべてのディレクトリを内包しているルートディレクトリ(/)を削除するとどうなるのか、なんてみんな考えますよね!(笑)

結論としては削除することができます!!が管理者権限(スーパーユーザーとして実行)と特殊なオプション(--no-preserve-root)が必要となってきます。コマンドはここには書きませんが以下の記事が参考になるかと思います。Enterキーを押すのは自己責任でお願いします。。。

ファイルを削除してしまっても、メモリ上に残っている部分は動作しつつけるっぽいですがもちろん一度電源を落としてしまうと二度と起動しなくなります。

Raspberry Piであれば10分もあればバックアップ、復元ができるので一度試してみてもいいかもしれませんね!!というか今度やってみます。

参考

以下のサイトの情報を引用・参考にしました。