Linux基礎(ファイルシステムの構成&ファイル検索)

#ファイルの配置について
Linuxでは、ファイルシステムのレイアウトはFHS(Filesystem Hierarchy Standard)という既定に基づき標準化されている。これにより、CentOSやDebianなど異なるディストリビューションでも主要となるディレクトリ構成は統一されている。

FHSでは、ディレクトリ階層の最上位にルートファイルシステム(/)に含める必要があるディレクトリや各ディレクトリの役割、ファイルの配置場所を定義している。ルートファイルシステムに含める必要のあるディレクトリは/bin, /sbin, /etc, /dev, /libの5つ。

|ディレクトリ名|説明|
|---|---|
|/bin|一般ユーザーでも実行可能な基本的なコマンドが配置<br>例｜cat, chmod, cp, echo, kill, ls, move, pwd, rm, su, unmount|
|/sbin|rootユーザーのみが実行可能なシステム管理コマンドが配置<br>例｜shutdown, fdisk, halt, ifconfig, init, mkfs, reboot, route|
|/etc|システムやコマンドの各種設定ファイル、スクリプトファイルが配置|
|/dev|ハードディスク、CD-ROM、DVD-ROMなどデバイスファイルが配置|
|/lib|共有ライブラリやカーネルモジュールが配置<br>/bin, /sbinにあるコマンドが必要とするライブラリがここに配置されている。|

ルートファイルシステムの主なディレクトリ

|ディレクトリ名|説明|
|---|---|
|/mnt|CD-ROMなどのファイルシステムの一時的なマウントポイント。最近はmediaが利用される|
|/opt|追加パッケージや追加プログラムがインストールされるディレクトリ|
|/proc|カーネル内部の情報にアクセスするための仮想ファイルシステム|
|/root|rootユーザー専用のディレクトリ。FHSではオプション|
|/boot|システム起動に必要なカーネルイメージや設定ファイルが配置される。起動時に影響を受けないようにルートファイルシステムとは別にして、ディスクの先頭付近に配置される場合もある。|
|/media|CD-ROMやUSBなどのリムーバルデバイスがマウントされるディレクトリ|
|/srv|システムで提供されるサイト特有のデータ(WWWなど)が配置|
|/tmp|一時的に使用する作業ファイルが配置。全てのユーザーが読み書き可能|
|/var|ログファイル、メールやプリンタのスプールなど頻繁nに更新されるファイルが配置。|
|/usr|一般ユーザーが共有するコマンド、ライブラリ、ドキュメントなどが配置される|

- var配下の主なディレクトリ

|ディレクトリ名|説明|
|---|---|
|/var/cache|manコマンドで使用される一時的なキャッシュファイルが配置|
|/var/lock|アプリケーションの排他制御で使用されるロックファイルが配置|
|/var/log|システムのログファイル(messages)、メールログ(maillog)などが配置|
|/var/run||システム状態を示すファイルが配置
|/var/spool|送信待ちメール(var/spool/mqueue)、印刷待ちのデータ(/var/spol/lpd)などが配置|

- usr配下の主なディレクトリ

|ディレクトリ名|説明|
|---|---|
|/usr/bin|一般ユーザー、rootユーザーが使用する基本コマンドが配置|
|/usr/sbin|システム管理コマンドが配置|
|/usr/lib|プログラムに必要なライブラリが配置|
|/usr/local|個人作成のコマンドなど、ローカルシステム管理で必要なプログラム、ドキュメントが配置|
|/usr/share|x86などのアーキテクチャに依存しないファイル。manコマンドで使用するマニュアルなどが配置|
|/usr/src|Linuxのカーネルソースなどのソースコードが配置|

#ファイル検索
##findコマンド
findコマンドは指定したディレクトリ以下のファイルやディレクトリを検索するコマンド。検索条件として正規表現を使用したり、検索結果のファイルやディレクトリに対して指定したコマンドなどが実行できる。また、ファイル名だけでなくアクセス権、ファイルサイズ、更新日等を条件にして検索することができる。

find [検索ディレクトリ] [検索条件] [アクション]

|検索条件|説明|
|---|---|
|-name 文字列|文字列を指定して検索|
|-atime 日時|最終アクセス日で検索|
|-mtime 日時|最終更新日で検索|
|-pem アクセス権|アクセス権(8進数またはパーミッション表記)で検索|
|-size サイズ|ブロック単位のファイルサイズで検索|
|-type タイプ|ファイルタイプで検索(ファイル:f, ディレクトリ:d, シンボリックリンク:l)|
|-user ユーザ名|ファイルの所有者で検索|
|-print|検索結果を表示(省略可能)|
|-exec コマンド¥;|検索結果のファイルに対して、コマンドを実行|
|-ok コマンド¥;|検索結果のファイルに対して、コマンドを実行(確認あり)|

```shell
# /etcディレクトリにある拡張子が「.conf」というファイルを検索
$ find /etc -name "*.conf"

# カレントディレクトリ以下から、9日以内に更新されたファイルを検索
$ find . -type f -mtime -10

# カレントディレクトリ以下から、61日以前にアクセスされたファイルを検索し、削除
$ find . -type f -atime +60 -exec rm {} ¥;
```

##locateコマンド
locateコマンドは、あらかじめ作成した検索用データベースに基づいてファイルやディレクトリを検索するコマンド。ファイル名などにワイルドカードを指定して検索可能でfindコマンドより高速に検索できる。

locate [ファイル名/ディレクトリ名]

```shell
# 拡張子がtxtのファイルを検索
$ locate ".txt"
```

updatedbコマンドは、検索用データベースを更新するコマンド。locateコマンドが使用する検索用のデータベースが作成された後、ファイルなどが更新された場合、それらのファイルなどを検索することはできない。そこで、updatedbコマンドで検索用データベースを定期的に更新する必要がある。なお、updatedbコマンドはcronで定期的に更新されるようになっている。/etc/updatedb.confで確認可能。

##whichコマンド
whichコマンドは、指定したコマンドが格納されているディレクトリを検索し絶対パスを表示するコマンド。
注意点としては、whichコマンドは環境変数PATHに設定さえていないディレクトリは検索対象にならないため、一般ユーザは/sbin/ディレクトリなどに配置されているシステム管理用コマンドは検索できない。

```shell
# passwdコマンドがどこに格納されているかを確認
$ which passwd
```
##whereisコマンド
whereisコマンドは、指定したコマンドのバイナリファイル、ソースファイル、マニュアルが格納されている場所を絶対パスで表示するコマンド。
whereis [オプション] コマンド

|オプション|説明|
|---|---|
|-b|バイナリファイルのみ検索して表示|
|-m|マニュアルファイルのみ検索して表示|
|-s|ソースファイルのみ検索して表示|

```shell
$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
```



##type
typeコマンドは、指定したコマンドが通常の実行ファイルか、シェルの仕組みコマンドか、エイリアスなのか、コマンドの種別を表示するコマンド。

```shell
$ type passwd
```