104.7 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
104 デバイス、Linuxファイルシステム、ファイルシステム階層標準 |
Objective: |
104.7 システムファイルを検索し、ファイルを正しい場所に配置する |
Lesson: |
1 of 1 |
はじめに
Linuxディストリビューションの見た目やサイズは様々ですが、ほとんどのディストリビューションが ファイルシステム階層標準(Filesystem Hierarchy Standard、FHS) と呼ばれるファイルシステムの “標準レイアウト” を採用しています。ファイルシステム階層標準とは、ファイルシステムの標準的なディレクトリ構成を定めたもので、そのおかげで相互運用やシステム管理がやりやすくなっています。このレッスンでは、ファイルシステム階層標準を説明するとともに、Linuxシステムでファイルを検索する方法を示します。
ファイルシステム階層標準
ファイルシステム階層標準(FHS)は、Linuxシステムにおけるディレクトリの構成と内容を標準化するために、Linux Foundationによって始められた試みです。この標準に従うことが必須要件になっているわけではありませんが、ほとんどのディストリビューションはこれに従っています。
Note
|
ファイルシステム階層標準の詳細を知りたければ、http://refspecs.linuxfoundation.org/fhs.shtml で提供されているFHS 3.0 specificationを読んでください。 |
ファイルシステム階層標準が定める基本的なディレクトリは以下のとおりです。
/
-
階層の頂点をなすルートディレクトリです。他のすべてのディレクトリはこのルートディレクトリの下に置かれます。ファイルシステムはよく逆さまの木にたとえられますが、ルートディレクトリはその根っこに相当します。枝に相当する他のディレクトリは、すべてこの根っこから枝分かれしたものになります。
/bin
-
システム起動時に必要となる最も重要なコマンドを格納します。
/boot
-
初期RAMディスク(initrd)やLinuxカーネルなど、カーネルの起動に必要なファイルを格納します。
/dev
-
デバイスファイルを格納します。システムに接続された物理デバイス(例えば1番目のSCSIないしSATAディスクである
/dev/sda
)だけでなく、カーネルが提供する仮想デバイスも格納します。 /etc
-
ホスト固有の設定ファイルを格納します。プログラムによっては、
/etc
以下に複数の設定ファイルが入ったサブディレクトリを作成することがあります。 /home
-
各ユーザーの個人用ファイルを置くホームディレクトリをこの中に作成します。通常、各ユーザーのホームディレクトリの名前は、ユーザー名と同じにします。ユーザーJohnのホームディレクトリは、
/home/john
にするということです。rootユーザーは例外で、/root
ディレクトリがホームディレクトリになります。サービスを実行するシステムユーザーには、/var/lib
の下に独自のホームディレクトリを持つものや、専用のホームディレクトリを持たないものもあります。 /lib
-
システム起動時に必要となる最も重要なコマンド(
/bin
ないし/sbin
に置かれる)を実行するために必要な共有ライブラリを格納します。64ビットCPUのシステムでは、32ビット用のライブラリと64ビット用のライブラリが分けて置かれることがあります。 /media
-
フラッシュドライブ、CDドライブやDVDドライブ、フロッピーディスク、メモリーカードなど、ユーザーがマウントするリムーバブルメディアを、このディレクトリ以下に自動的にマウントします。
/mnt
-
ファイルシステムを一時的にマウントする際に、このディレクトリをマウントポイントにします。
/opt
-
システムに標準ではないオプションのソフトウェアを格納します。
/root
-
rootユーザーのホームディレクトリです。
/run
-
アプリケーションが実行時に使用するデータ(主にはPIDを記録したファイル)を格納します。
/sbin
-
システム起動時ないしメンテナンス時にシステム管理者が使用するコマンドの実行可能ファイルを格納します。
/srv
-
システムサービスが利用するデータを格納します。例えば、ウェブサーバーが提供するページを
/srv/www
に格納します。 /tmp
-
一時ファイルを格納します。
/usr
-
システム起動時やメンテナンス時に必要とされない、大部分のプログラムや読み取り専用のデータを格納します。大部分のプログラムやデータは、このディレクトリの下に置かれます。
/proc
-
実行中のプロセス情報を保持する仮想ファイルを格納します。
/var
-
印刷キュー、ログ、メールボックス、一時ファイル、ブラウザのキャッシュなど、システムが動いている間は頻繁に書き換えられる可変データを格納します。
/etc
、/usr
、/var
など、いくつかのディレクトリには、上で紹介したディレクトリをサブディレクトリに持つものがあります(/usr/bin
や /var/tmp
のようなサブディレクトリが存在します)。
一時ファイル
一時ファイルとは、プログラムが一時的に作業用のデータを保持するファイルのことです。一時ファイルの例としては、実行中のプロセスに関するデータ、クラッシュログ、自動保存されたファイル、ファイルを変換するときの中間ファイル、キャッシュファイルなどがあります。
一時ファイルの保存場所
ファイルシステム階層標準(FHS)では、一時ファイルの保存場所を定めています。用途に応じて複数の保存場所があり、それぞれ挙動が異なります。よって、一時ファイルを保存する際には、開発者がFHSに従って保存場所を決めることが推奨されます。
/tmp
-
このディレクトリに保存されたファイルは、次にプログラムを呼び出すときまで保存されている保証がありません。システムの起動時にこのディレクトリ内のファイルをすべて消すことが推奨されています。
/var/tmp
-
このディレクトリに保存されたファイルは、起動時に 消すべきではない とされているので、再起動しても残っていることが多いでしょう。
/run
-
プロセスID(
.pid
)など、実行中のプロセスが使用する、実行時に変化するデータ(ランタイムファイル)を保存します。複数のランタイムファイルを必要とするプログラムは、このディレクトリにサブディレクトリを作る場合があります。システムの起動時にはこのディレクトリ内のファイルを 消去します。かつては/var/run
ディレクトリがこの用途に充てられていたので、/var/run
ディレクトリが/run
ディレクトリへのシンボリックリンクになっているシステムもあります。
上記とは異なる場所に一時ファイルを作成することもできますが、FHSに従うことが望ましいです。
ファイルの検索
find
コマンドを使うと、Linuxシステムでファイルを検索できます。このコマンドはとても有用なツールです。オプションが様々あり、動作や出力を必要に応じて調整できます。
find
コマンドは、検索開始位置と条件式を引数に指定します。例えば、カレントディレクトリとそのサブディレクトリの中から、ファイル名が .jpg
で終わるファイルを検索するなら、以下のコマンドを実行します(.
が検索開始位置、-name '*.jpg'
が条件式です)。
$ find . -name '*.jpg' ./pixel_3a_seethrough_1.jpg ./Mate3.jpg ./Expert.jpg ./Pentaro.jpg ./Mate1.jpg ./Mate2.jpg ./Sala.jpg ./Hotbit.jpg
このコマンドは、ファイル名の最後の4文字が .jpg
であるすべてのファイル名を出力します。*
はすべての文字を表すワイルドカードなので、.jpg
の前にどの文字があってもマッチします。.jpg
の 後 にも *
を置くとどうなるかを見てましょう。(訳注: -name
に指定するパターンは、正規表現ではなくシェルと同様のグロブパターンです。)
$ find . -name '*.jpg*' ./pixel_3a_seethrough_1.jpg ./Pentaro.jpg.zip ./Mate3.jpg ./Expert.jpg ./Pentaro.jpg ./Mate1.jpg ./Mate2.jpg ./Sala.jpg ./Hotbit.jpg
上記の出力で太字にしている Pentaro.jpg.zip
ファイルは、先の例では出力されていませんでした。ファイル名に .jpg
を含んでいるものの、その後に余計な文字があるので、先の例ではマッチしなかったのです。上記のコマンドは、.jpg
の前後が何でもよいという意味なので、このファイルもマッチします。
Tip
|
|
シェルがパターンを解釈してしまわないように、*.jpg
を '
(シングルクォート)ないし "
(ダブルクォート)で囲みます。グロブパターンを引数に使用する場合には、意図しないマッチを防ぐために、クォートで囲む習慣をつけておいたほうがよいです。
デフォルトでは、find
コマンドは、検索開始位置から再帰的にサブディレクトリをたどっていきます。-maxdepth N
オプションを指定すると、サブディレクトリをたどる階層を N
に限定します(訳注:ディレクトリ階層の深い部分まで探りたくない場合などに使用します)。逆に N
階層目から検索を始める -mindepth N
オプションもあります。どちらも、検索開始位置を1としてカウントします。
-mount
オプションを指定すると、検索開始位置とは異なるファイルシステムにあるディレクトリを検索しなくなります。-fstype
オプションを指定すると、指定したファイルシステムタイプだけを検索するようになります。find /mnt -fstype exfat -iname "*report*"
コマンドは、/mnt
以下にマウントされたexFATファイルシステムだけを検索します。
ファイルの属性で検索する
以下に示すオプションを指定すると、ファイルの属性を条件として検索できます。例えば、現在のユーザーが書き込み可能なファイル、指定したパーミッションのファイル、指定したサイズのファイルなどを検索できます。
-user USERNAME
-
ユーザー
USERNAME
が所有者であるファイルにマッチします。 -group GROUPNAME
-
グループ
GROUPNAME
が所有グループであるファイルにマッチします。 -readable
-
現在のユーザーが読み取り可能なファイルにマッチします。
-writable
-
現在のユーザーが書き込み可能なファイルにマッチします。
-executable
-
現在のユーザーが実行可能なファイルにマッチします。ディレクトリに関しては、現在のユーザーが中に入れる(
x
パーミッションがある)ディレクトリにマッチします。 -perm NNNN
-
NNNN
パーミッションのファイルにマッチします。例えば、-perm 0664
は、所有者と所有グループは読み書き可能でその他は読み取り可能なファイル(パーミッションがrw-rw-r--
のファイル)にマッチします。
NNNN
の直前に -
をつけると、少なくとも NNNN
のパーミッションのファイルにマッチします。例えば、-perm -644
は、少なくとも 644
(rw-r--r--
)のパーミッションのファイルにマッチします。664
(rw-rw-r--
)や 775
(rwxrwxr-x
)のパーミッションのファイルにもマッチします。
-empty
-
空のファイルやディレクトリにマッチします。
-size N
-
サイズが
N
のファイルにマッチします。N
は、デフォルトでは、512バイトのブロックの数です。N
に他の単位をつけることもできます。Nc
はバイト、Nk
はキビバイト(KiB、1KiBは1024バイト)、NM
はメビバイト(MiB、1MiBは1024×1024バイト)、NG
はギビバイト(GiB、1GiBは1024×1024×1024バイト)です。
+
ないし -
を N
の直前につけると、そのサイズより 大きい ファイルまたは 小さい ファイルを検索できます。例えば、-size -10M
は、サイズが10MiBよりも小さいファイルにマッチします。
例えば、ホームディレクトリ以下から、ファイル名のどこかに report
というパターンを含み(大文字と小文字を区別しない)、0644
のパーミッションで、10日以上前にアクセスされ、サイズが1MiBより大きいファイルを検索するなら、次のコマンドを実行します。
$ find ~ -iname "*report*" -perm 0644 -atime 10 -size +1M
時間で検索する
タイムスタンプ属性(アクセス日時・属性変更日時・更新日時)を利用してファイルを検索することもできます。そのために使用するオプションは次のとおりです。
-amin N
、-cmin N
、-mmin N
-
それぞれ、アクセス日時、属性変更日時、更新日時が、
N
分前のファイルにマッチします。 -atime N
、-ctime N
、-mtime N
-
それぞれ、アクセス日時、属性変更日時、更新日時が、
N×24
時間前(N
日前)のファイルにマッチします。
アクセス日時(atime)は、そのファイルにアクセスされた時に更新されます。属性変更日時(ctime)は、ファイルの属性、すなわちinodeの内容が変更された時に更新されます。パーミッションや所有者が変更された時や、他のタイムスタンプが更新された時にも更新されますから、「何かの操作」を行った時に更新されるものと考えても構いません。更新日時(mtime)は、ファイルの内容が書き換えられた時に更新されます。
例えば、カレントディレクトリ以下から、更新日時が24時間(1日)以内で、サイズが100MiBより大きいファイルを検索するなら、次のコマンドを実行します。
$ find . -mtime -1 -size +100M
訳注:-exec
オプションを使用するとマッチしたファイルに対して任意のコマンドを実行できるなど、find
コマンドは多才で強力なツールであり、特にファイルシステムを再帰的にたどって処理する場面には欠かせません。manページなどを参照して、さまざまな機能を概観しておくことをお勧めします。
locate
と updatedb
を使用する
locate
を使うと、Linuxシステムで指定したパターンにマッチするファイルを高速で見つけ出せます。find
のようにファイルシステムを検索するのではなく、locate
は updatedb
によって生成されるデータベースを検索します。そのため、高速で結果を得られますが、データベースが更新されていない場合には結果が不正確になることがあります。
locate
の後に検索パターン(グロブパターン)を指定して実行すると、そのパターンにマッチするファイルを出力します。例えば、システムに存在するすべてのJPEG画像を検索するなら、locate jpg
を実行します(訳注:このコマンドはあくまでもファイル名に jpg
を含むファイルを検索するのであって、.jpg
ではなく .jpeg
や .JPG
がファイル名になっているJPEG画像を検索することはできません)。このコマンドを実行すると、以下のような結果を出力します。
$ locate jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/pixel_3a_seethrough_1.jpg /home/carol/Downloads/jpg_specs.doc
jpg
というパターンを指定すると、locate
はファイル名のどこかに jpg
を含むファイルをすべて出力します。上の例にある jpg_specs.doc
のように、jpg
という文字列をファイル名に含んでいるけれどもサフィックスが jpg
ではないファイルも出力されます(訳注:locate .jpg
を実行すると、.jpg
という文字列をファイル名に含むファイルを検索するので、サフィックスが jpg
であるファイルの検索に近づきます)。
Tip
|
|
デフォルトでは大文字と小文字を区別します。locate jpg
は、パターンが小文字で指定されているので、JPG
をファイル名に含むファイルを出力しません。大文字と小文字を区別しないようにするには、-i
オプションを指定します。先ほどの例を改良して実行します。
$ locate -i .jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate1_old.JPG /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/pixel_3a_seethrough_1.jpg
上で太字にした Mate1_old.JPG
ファイルが、最初の例では出力されていなかったのですけれども、今回は出力されています。
locate
の後に半角スペースで区切って複数のパターンを指定できます。以下の例は、大文字と小文字を区別せず、zip
または jpg
というパターンにマッチするファイルを検索します。
$ locate -i zip jpg /home/carol/Downloads/Expert.jpg /home/carol/Downloads/Hotbit.jpg /home/carol/Downloads/Mate1.jpg /home/carol/Downloads/Mate1_old.JPG /home/carol/Downloads/Mate2.jpg /home/carol/Downloads/Mate3.jpg /home/carol/Downloads/OPENMSXPIHAT.zip /home/carol/Downloads/Pentaro.jpg /home/carol/Downloads/Sala.jpg /home/carol/Downloads/gbs-control-master.zip /home/carol/Downloads/lineage-16.0-20190711-MOD-quark.zip /home/carol/Downloads/pixel_3a_seethrough_1.jpg /home/carol/Downloads/jpg_specs.doc
複数のパターンを指定する際に -A
オプションを付けると、すべてのパターンにマッチする結果を出力するようにできます。次のコマンドは、.jpg
と .zip
の両方にマッチするファイルを出力します。
$ locate -A .jpg .zip /home/carol/Downloads/Pentaro.jpg.zip
-c
オプションを指定すると、マッチしたファイルのフルパスを出力するのではなく、マッチしたファイルの数をカウントして出力します。例えば、以下のコマンドを実行すると、システムに存在する .jpg
にマッチするファイルの数を出力します。
$ locate -c .jpg 1174
locate
コマンドには、updatedb
によって生成されるデータベース(/var/lib/ mlocate.db
)に存在するエントリだけを出力するという特徴があります。データベースが古ければ、すでに削除されたファイルを出力します。-e
オプションを指定すると、ファイルが現存するかを確認してから出力するようになるので、こうした事態を避けられます。
-e
オプションを指定しても、データベースが更新された後に作成されたファイルは出力されません。updatedb
コマンドを実行してファイルを調べ直し、データベースを更新することで解決できます。ただし、updatedb
の実行にはroot権限が必要ですし、ディスクに大量のファイルが存在する場合には updatedb
コマンドの実行に時間がかかることがあります。
updatedb
の挙動を設定する
updatedb
の挙動を /etc/updatedb.conf
ファイルで設定できます。このファイルは各行が一つの変数であるテキストファイルです。空白行は無視され、#
で始まる行はコメントとして扱われます。
PRUNEFS=
-
このパラメータの記載したファイルシステムタイプは、
updatedb
コマンドの対象になりません。大文字と小文字を区別しないので、NFS
とnfs
は同じになります。 PRUNENAMES=
-
このパラメータの後に記載した名前のディレクトリは、
updatedb
コマンドの対象になりません。 PRUNEPATHS=
-
このパラメータの後に記載したパスは、
updatedb
コマンドの対象になりません。例えば/var/pool /media
などを記載します。
pruneは「(余計な枝などを)刈り取る」という意味であり、updatedb
の対象としないものを記載します。複数記載する場合は半角スペースで区切ります。システムがデフォルトで作成している /etc/updatedb.conf
の内容を見ると要領がわかります。
実行可能ファイル、マニュアルページ、ソースファイルを検索する
which
コマンドは、実行可能ファイルのフルパスを示します。例えば、bash
の実行可能ファイルの場所を知りたければ、次のコマンドを実行します。
$ which bash /usr/bin/bash
-a
オプションを付けると、(PATH指定の順で)すべての実行可能ファイルのフルパスを表示します。先頭に表示されるものが、コマンド名だけを入力したときに実行されるものです。例を見てみましょう。
$ which mkfs.ext3 /usr/sbin/mkfs.ext3 $ which -a mkfs.ext3 /usr/sbin/mkfs.ext3 /sbin/mkfs.ext3
Tip
|
どのディレクトリが( |
type
コマンドは、実行可能ファイルのフルパスと種類を表示します。type
に続けて調べたいコマンドの名前を入力します。
$ type locate locate is /usr/bin/locate
which
と同様に、-a
オプションを付けると、すべての実行可能ファイルのフルパスを表示します。例えば次のような出力になります。
$ type -a locate locate is /usr/bin/locate locate is /bin/locate
-t
オプションを付けると、コマンドの種類を表示します。コマンドの種類には alias(エイリアス)
、keyword(予約語)
、function(関数)
、builtin(組み込み)
、file(ファイル)
があります。以下にいくつか例を示します。
$ type -t locate file $ type -t ll alias $ type -t type type is a built-in shell command
whereis
コマンドは少し視点が異なり、実行可能ファイルだけではなく、マニュアルページやソースファイル(存在する場合)も検索します。whereis
の後に調べたいコマンドの名前を入力します。
$ whereis locate locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
上の例では、コマンド本体の実行可能ファイル(/usr/bin/locate
)と圧縮されたマニュアルページ(/usr/share/man/man1/locate.1.gz
)が結果として出力されています。
オプションを指定すれば表示する結果を絞り込めます。-b
オプションを指定すれば実行可能ファイルだけを、-m
オプションを指定するとマニュアルページだけを、-s
オプションを指定するとソースファイルだけを表示します。同じ例を続けると、次のようになります。
$ whereis -b locate locate: /usr/bin/locate $ whereis -m locate locate: /usr/share/man/man1/locate.1.gz
演習
-
プログラムの実行に一時ファイルが必要です。プログラムの実行終了後に使うことはない一時ファイルです。その一時ファイルを作成するのに適しているディレクトリはどれですか?
-
起動時に必ず消去される一時ファイルを格納するディレクトリはどれですか?
-
find
コマンドで、カレントディレクトリ以下から、現在のユーザーが書き込み可能で、過去10日以内に更新され、4GiBより大きいサイズのファイルを検索してください。 -
locate
コマンドで、ファイル名に、report
というパターンを含み、かつupdated
、update
、updating
のいずれかのパターンを含むファイルを検索してください。(訳注:目的のファイルがすべて結果に出力されるなら多少余計な出力が混じってもよいので、厳密に考えないようにしましょう。) -
ifconfig
のマニュアルページの場所を検索してください。 -
ntfs
ファイルシステムをupdatedb
の対象としないようにするには、/etc/updatedb.conf
にどう記載しますか? -
システム管理者として内蔵ディスク(
/dev/sdc1
)を一時的にマウントするときに、FHSに従うなら、どのディレクトリにマウントしますか?
発展演習
-
locate
コマンドは、updatedb
によって生成されたデータベースを参照して結果を出力します。そのデータベースが古いせいで、locate
コマンドが、もう存在しないファイルを結果として出力してしまうことがあります。存在しないファイルを出力しないようにするには、locate
コマンドにどのオプションを指定しますか? -
カレントディレクトリとその2階層下のサブディレクトリまでを対象として、カレントディレクトリとは異なるファイルシステムは対象とせず、ファイル名に
Status
またはstatute
が含まれるファイルを検索してください。(訳注:目的のファイルがすべて結果に出力されるなら多少余計な出力が混じってもよいので、厳密に考えないようにしましょう。) -
/mnt
以下から、ext4
ファイルシステムを対象として、少なくとも所有者が読み取りと実行が可能、かつ、所有グループが読み取り可能で、直近2時間に属性が変更されたファイルを検索してください。 -
カレントディレクトリから2階層以上深いサブディレクトリを対象として、更新日時が30日より前の空のファイルを検索してください。
-
ユーザー
carol
とjohn
はグループmkt
のメンバーです。john
のホームディレクトリ以下から、carol
が読み取れるファイルを探してください。
まとめ
このレッスンでは、LinuxシステムにおけるFHSに準拠したファイルシステムの構造と、名前や属性からコマンドやファイルを検索する方法を説明しました。以下のコマンドを取り上げました。
find
-
様々な条件からファイルやディレクトリを検索するコマンドです。
locate
-
データベースを使用して、マシンに保存されているファイルの位置を見つけるコマンドです。
updatedb
-
locate
コマンドが使用するデータベースを更新します。 which
-
実行可能ファイルのフルパスを表示します。
whereis
-
実行可能ファイルとマニュアルページ、ソースファイルの場所を表示します。
type
-
実行可能ファイルの場所とコマンドの種類(
ファイル
、組み込み
など)を表示します。
演習の解答
-
プログラムの実行に一時ファイルが必要です。プログラムの実行終了後に使うことはない一時ファイルです。その一時ファイルを作成するのに適しているディレクトリはどれですか?
プログラムの実行終了後に使わない一時ファイルなので、
/tmp
ディレクトリが適しています。 -
起動時に必ず消去される一時ファイルを格納するディレクトリはどれですか?
/run
です。/var/run
が存在するシステムなら/var/run
もです。 -
find
コマンドで、カレントディレクトリ以下から、現在のユーザーが書き込み可能で、過去10日以内に更新され、4GiBより大きいサイズのファイルを検索してください。-writable
、-mtime
、-size
オプションを指定して、以下のコマンドを実行します。find . -writable -mtime -10 -size +4G
-
locate
コマンドで、ファイル名に、report
というパターンを含み、かつupdated
、update
、updating
のいずれかのパターンを含むファイルを検索してください。(訳注:目的のファイルがすべて結果に出力されるなら多少余計な出力が混じってもよいので、厳密に考えないようにしましょう。)locate
でパターンを「かつ」でつなげるので、-A
オプションを指定します。locate -A "report" "updat"
-
ifconfig
のマニュアルページの場所を検索してください。whereis
コマンドで-m
オプションを指定します。whereis -m ifconfig
-
ntfs
ファイルシステムをupdatedb
の対象としないようにするには、/etc/updatedb.conf
にどう記載しますか?PRUNEFS=
の後にupdatedb
の対象としないファイルシステムタイプを書くので、PRUNEFS=ntfs
と記載します。 -
システム管理者として内蔵ディスク(
/dev/sdc1
)を一時的にマウントするときに、FHSに従うなら、どのディレクトリにマウントしますか?技術的にはディスクをどこにマウントすることもできますが、FHSに従うなら
/mnt
にマウントします。
発展演習の解答
-
locate
コマンドは、updatedb
によって生成されたデータベースを参照して結果を出力します。そのデータベースが古いせいで、locate
コマンドが、もう存在しないファイルを結果として出力してしまうことがあります。存在しないファイルを出力しないようにするには、locate
コマンドにどのオプションを指定しますか?locate -e PATTERN
のように-e
オプションを指定して実行します。 -
カレントディレクトリとその2階層下のサブディレクトリまでを対象として、カレントディレクトリとは異なるファイルシステムは対象とせず、ファイル名に
Status
またはstatute
が含まれるファイルを検索してください。(訳注:目的のファイルがすべて結果に出力されるなら多少余計な出力が混じってもよいので、厳密に考えないようにしましょう。)-maxdepth
はカレントディレクトリも含めて階層を数えるので、1+2=3を指定します。次のコマンドを実行します。find . -maxdepth 3 -mount -iname "*statu*"
-
/mnt
以下から、ext4
ファイルシステムを対象として、少なくとも所有者が読み取りと実行が可能、かつ、所有グループが読み取り可能で、直近2時間に属性が変更されたファイルを検索してください。-fstype
オプションに続けて検索対象とするファイルシステムタイプを指定します。パーミッションを3桁の数値で考えると、所有者が読み取りと実行が可能だということは最初の桁が5以上で、所有グループが読み取り可能だということは2桁目が4以上で、その他のパーミッションは気にしなくてもよいということは最後の桁が0以上です(まとめると、パーミッションが540以上だということです)。属性変更日時がN分以内のファイルを検索する場合には-cmin N
を指定します。よって、実行するコマンドは次のとおりです。find /mnt -fstype ext4 -perm -540 -cmin -120
-
カレントディレクトリから2階層以上深いサブディレクトリを対象として、更新日時が30日より前の空のファイルを検索してください。
-mindepth N
オプションを指定すると、カレントディレクトリからN-1階層以上深いサブディレクトリを対象として検索します(カレントディレクトリを1として階層を考えることに注意してください)。空のファイルを検索するには-empty
オプションを指定します。更新日時を日単位で指定するのは-mtime N
オプションです。よって、実行するコマンドは次のとおりです。find . -empty -mtime +30 -mindepth 3
-
ユーザー
carol
とjohn
はグループmkt
のメンバーです。john
のホームディレクトリ以下から、carol
が読み取れるファイルを探してください。グループ
mkt
で共有するファイルは、所有グループをmkt
にするのが一般的です。所有グループがmkt
で、グループパーミッションがr
(4
)以上のファイルを検索します。よって、実行するコマンドは次のとおりです。find /home/john -group mkt -perm -040