Previous Topへ Next

UNIXコマンドを実戦に使う2/UNIX commands in action 2

ファイルを削除する

前段でファイルを作成するechoコマンドについて説明しました。
作成するコマンドがあれば、削除するコマンドもあります。
削除するコマンドはrmです。
まず練習してみましょう。
前段のechoコマンドでまず練習用のファイルを作ってみます。

echo > test.txt

今度はこのファイルを削除します。

rm test.txt

前段でカレントディレクトリが~の時にデスクトップにファイルを作る時は

echo > ~/Desktop/test.txt

というコマンドを使うと書きました。削除する時も

rm ~/Desktop/test.txt

と入力します。このようにコマンドの使い方、パスの記述の仕方は応用が利きます。
このコマンドもバリエーションがあります。

ディレクトリを削除

rm -r
(空のディレクトリを削除する)

rm -rf
(ディレクトリを中身ごと一度に削除する:このコマンドは使用に注意が必要です。詳しくは下に書いていますのでよく読んで下さい)

このオプションfは「force to do it」ということで、これを打つとシェルは確認のアラートをいちいち出さずに削除を実行してしまいます。






これはMacOSXでは時々あることですが、ダウンロードに失敗したとか、ファイルを加工中にアプリが落ちて、テンポラリファイルが残ったりした場合これをゴミ箱に入れて削除しようとしても、

「アプリケーション○○が使用中のため削除できません」
「アクセス権が無いために削除できません」

などのアラートが出て削除できない時があります。
これはOSXで稀に起こるトラブルで、気にしなくても大きな問題は起こしませんが削除できないファイルがゴミ箱に残るというのは気分が悪いものです。

そこでゴミ箱の中身を強制的に削除するコマンドをこのようにタイプします。

ゴミ箱の中身を強制的に削除する
sudo rm -rf ~/.Trash/*

(このコマンドの使用は要注意です。以下に詳しく書きますが、タイプミスをするととんでもない結果になりますので下記の詳細をよく読んでから注意して使って下さい。)


「-rf」は前段でも触れたようにディレクトリを中身もろとも警告無しに削除するというオプションです。
ゴミ箱の実体はユーザディレクトリの直下にある「.Trash」という不可視フォルダです。
その中身を全て削除という意味で「/*」というディレクトリを記述します。
これを忘れるとゴミ箱そのものを削除してしまいます。

(このスラッシュの後のアスタリスク*は任意のファイル名、ディレクトリ名という意味です。
通常UNIXでは操作するファイル名、ディレクトリ名を正確に指定してやる必要があります。1文字でも違っていると操作を受け付けないのですが、それでは多数のファイルを一度に操作する時に不便なので、そういうファイル名を「/の後にある何か」というようなざっくりとした指定の仕方ができます。こういう「何か」に当たる記号が*になります。こういうのをUNIX用語ではワイルドカードと呼んでいます。)


さてこのコマンドの頭についている「sudo」というのが問題です。

UNIXというOSは最初からサーバクライアントという使い方をするシステムとして設計されています。つまり複数のユーザがログインして使うことが前提になっています。
複数というのはある場合は不特定多数ということも考えられます。
そうなると、パソコンを一人で使っている場合には起きなかった問題が起きます。
せっかく作ったファイルを他人が勝手に消してしまったら困ります。
ましてや初心者もログインしてきてわけも判らずにシステムの基幹ファイルを削除してしまったらどうなるでしょうか?
たちまちこのコンピュータにログインする人たちが全員作業に支障をきたしてしまいます。

そこでUNIXでは所有権とアクセス権という考え方を最初から採用していました。
アクセス権というのはあるファイル(またはディレクトリ)を見ることができるか、書き換えることもできるか、見ることも上書きもできないかというふうに設定できます。(他に実行権などというのもありますがここでは説明を省きます)
所有権はオーナー、グループ、その他と別れますがこれはそのファイルを作った人、使うことを許可されたグループ、それ以外の一般ユーザというふうに分かれていると理解して下さい。
それぞれのレベルの所有権の人にどこまでアクセスを許すかというのがこの設定です。

詳細は省きますが、システムが作成したファイルは多くの場合、システムが所有者になっていてユーザは見ることができても書き換えができない、あるいはユーザは触ることができないように設定されています。
もしOSXを一人で使っている管理者ユーザだとしても、その人はUNIX的にはただの管理権のあるユーザに過ぎません。

UNIXの世界ではシステムと同じくすべてを触ることができる権利者を

「root」

と呼びます。これは先ほども書いた管理者ユーザ(またはアドミニストレータ:Administrator)とは別物です。
管理者ユーザは共有の開始、ネットワーク接続などの環境設定を変更することができるユーザというだけで、システムが書き換えを禁じたファイルを書き換えることができないという意味では一般ユーザと同じです。

これでマルチユーザのUNIXシステムは安全を確保していますが、もしシステムの管理者がシステムの不具合を調整したい時に触ることができない領域が広範にあると、今度はシステムのメンテナンスができなくなります。

そこで「root」というユーザが用意されています。
「root」は他のユーザやシステムが書き換えを禁じたファイルでも自由に書き換えたり削除できます。
あらゆるアクセス権の制限を受けないという意味で、UNIXの世界では「root」は全知全能の「神の権限」とよく言われます。
誰もが簡単に神になれたら大変な問題ですから通常「root」はパスワードによって保護されています。

MacOSXのterminal環境では通常デフォルトで「root」でログインすることはできないように設定されています。
「root」はもし破られると、システムを第3者に自由に操られてしまうというセキュリティ上の危険が伴います。
UNIXに対するクラッカーの攻撃は、大抵は「root」権限を乗っ取るために様々なスキャンをかけるというものです。
それぐらいこの「root」というのは絶対的なものなのです。

「root」でログインする方法は後段で書きますが、スキル的に「root」を設定しても大丈夫という人以外はあまりやらない方が良いかも知れません。
しかし権限を制限されたままではシステムの調整をする時に不便です。
先ほどの例のようにゴミ箱に削除できないファイルが残ってしまう場合も「root」権限でないと対処できません。
そこで「root」ではない管理者ユーザでも「root」と同じ権限で作業することができるコマンドが用意されています。
それが

sudo

というコマンドです。
suというのは一般的にはスーパーユーザと言われています。
UNIXのマニュアルを見るとsudoは他のユーザに成り代わってアクセス権、所有権を越えた操作をすると書いてあります。

(注:このsuについてはHiro's Personal PageではHiroさんが「suはselect userの略だ」と書いておられます。また専門サイトを調べていると「suはswitch userの略」と解説しているところもあります。私自身もこれはスーパーユーザーの略ではないという説明を聞いたことがあります。
しかしシェルのmanコマンドで調べてみるとスーパーユーザーという説明が書いてあったりします。
これの語源はなかなか諸説あるのですが、suというコマンドは実はroot以外のアカウントにも自由になれるという意味ではswitch userまたはsubstitute userという用語が正しいのだろうけど、一般的にはsuコマンドはrootになる時ぐらいしか使わないので、スーパーユーザーという理解でも良いんじゃないかと思っています。)

(さらに後日注:このsuの語源について調べると、一応「始まった時はスーパーユーザーという意味でスタートしたが、後にルート以外のユーザにもなりかわれるというコマンドがインストールされ、その世代からサブスティテュートユーザーの略ということに変わった」という定説があるのだそうです。余談ですがそれはあくまで定説だし、いまでもスーパーユーザという用語を使っている人が多いので私も、これに従うことにします。)


先ほどのゴミ箱の中身を強制削除するコマンドの

sudo rm -rf ~/.Trash/*

というコマンドは、「仮設的にルートユーザになってゴミ箱の中身を強制的に削除する」という意味です。
「root」に成り代わるわけですから当然、このコマンドを実行する時は「root」のパスワードを要求されます。

注意!

このコマンドを使う時は注意が必要です。
rm -rfは先にも書いたようにディレクトリを中身ごと警告無しに削除してしまうというコマンドです。これに「root」権限のsudoが組み合わさったわけですから強力かつ危険なコマンドになっていることが容易に想像できると思います。

rm -rf ~/

までタイプした時に、間違えてenterキーを叩いてしまうとユーザディレクトリの中身を全部削除してしまいます。
ユーザディレクトリはブラウザのブックマークやメールのアドレス、メッセージ、一般的には音楽ファイルやこれまで仕事で書いてきたドキュメントファイル、個人の環境設定など重要なファイルが全て入っていますので、消えてしまうと大変なことになります。
それも一瞬にして消えてしまいますのでタイプする時は慎重にやる必要があります。

もっと悲惨なのはsudoコマンドと組み合わせて

sudo rm -rf /

までタイプした時にenterキーを押してしまったときです。
まだ「root」権限をそのセッションの中で行使していなければ、パスワードを訊かれますが行使しているとパスワード無しに一瞬で実行されてしまう可能性があります。
このコマンドの意味は「ハードディスク上の全てのファイル、ディレクトリを確認無しに強制的に削除せよ」という内容になります。
間違ってもこういうふうには打たないことです。

sudo等を最初に実行する時に

「あなたはUNIXについて十分な説明を受けていますね?
タイプする前によく考えるという原則を常に心に留めておいて下さい」

というUNIXの警告が出てきます。
この言葉は深い意味を持っています。
enterキーを叩く前にタイプミスが無いか必ず見直すという習慣をつけて下さい。







上段で書いたsudoを頭につけるコマンドは、システムのメンテナンスでよく使います。
それはシステム全体を検査したり、修復したりする場合やはりルートの権限が必要だからです。

ここでは、システムが自動生成するフォルダなどのデータを書き留めるファイルを削除するというコマンドを説明します。

GUI環境で特定のフォルダやアプリを開いた時に開くウィンドウはサイズ、位置などが記録されているため次回に同じ物を開く時にもまた同じサイズ、位置で開きます。
またFinderはウィンドウの配置、アイコンの大きさ、背景の色など実に様々な情報を記憶しています。
この記録の実体がそれぞれのフォルダの中にある「.DS_Store」という名称の不可視ファイルです。


.DS_Storeという不可視ファイルにウインドウの位置、
大きさ、背景色などの記録が残されている


この不可視ファイルがあることで上記の便利な機能が実現しているわけですが、長期間に渡って使っているとこのファイルが壊れてくることがあります。
そうするとウィンドウのサイズを覚えないなどの不具合が出てきて、アイコンが消えたりすることもあります。

そこである程度の期間が経ったらこのファイルを削除してやる必要があります。
このファイルは削除しても再起動すればシステムが自動生成するので問題は無いのですが、問題はこのファイルは膨大な数があるということです。

試しに既出のls -aのコマンドで探してみると、起動ボリュームの中にもホームディレクトリの中にも、アプリケーションディレクトリの中にもあることが判ります。
大部分のディレクトリの中にはあるので、これをrmコマンドを使ってひとつずつ削除していたら大変です。

GUI環境でも Ceola のような不可視ファイルを見ることができるユーティリティがありますが、これで探して削除するのはもっと大変です。


不可視ファイルを見ることができるユーティリティを使うと
「.DS_Store」という不可視ファイルはあらゆるディレクトリにあることが判る


そこで全てのディレクトリから名前でファイルを検索して、該当するファイルを全て削除するというコマンドを使います。

ある特定のファイル名でファイルを探し削除する

sudo find / -name "ファイル名" -delete

(/は起動ボリュームをさす。homeなら~)


これは起動ボリュームの中から"ファイル名"という名前のファイルを見つけて、ルート権限で削除するという意味のコマンドです。
試しに

[MacintoshHD:~] muta% sudo find / -name ".DS_Store" -delete

というコマンドを打ってみましょう。数分かかってプロンプトをもう一度表示したら作業完了です。前段のコマンド履歴を記憶させる設定をしていれば次回からは、カーソルキーとenterキーだけでこの複雑な作業ができてしまいます。
GUI環境でこれをやるとしたら何時間かかるでしょうか?
しかもどれだけのプロセスの操作をしなければならないでしょうか?
これがUNIXコマンドの便利さです!











Previous Topへ Next





site statistics