この記事はLinuC Level1 副主題1.02.4「ファイルの配置と検索」に対応した要点解説です。試験で問われる範囲に絞り、find・locate・updatedb・type・whereis・whichの使い分けと、FHS(Filesystem Hierarchy Standard)の主要ディレクトリを整理しました。
📚 LinuC Level1 完全攻略マップ(全39サブ項目)へ戻る
目次
- この記事でできるようになること
find:ファイルシステムを直接検索locateとupdatedb:DB型の高速検索- コマンドの場所を調べる:
type/which/whereis - FHS(Filesystem Hierarchy Standard)
- FHS 主要ディレクトリ
- よくある質問(FAQ)
- まとめ
- 模擬問題にチャレンジ(ランダム出題)
1. この記事でできるようになること
- ✅
findの基本書式と主な検索条件(-name/-type/-size/-user/-perm/-mtime/-atime/-maxdepth/-mindepth) - ✅
findのアクション(-print/-print0/-exec)と使い分け - ✅
-permの数値指定(完全一致/最低ビット-/いずれか/) - ✅
locateとupdatedb、設定ファイル/etc/updatedb.conf - ✅
type/which/whereisの役割の違い、type -tの返す種別 - ✅ FHSの位置づけと、
/bin・/sbin・/usr/bin・/usr/sbin・/lib・/usr/lib・/usr/share/man・/usr/localの用途
2. find:ファイルシステムを直接検索
findは指定ディレクトリ以下を実際に歩き回り、条件に合うファイルやディレクトリを探します。書式は「どこから探すか」「どんな条件か」「見つけたら何をするか」の3部構成です。
find [探索開始パス] [検索条件] [アクション]
もっとも基本形はfind /etc -name httpd.confのように「開始ディレクトリ」と「-name ファイル名」の組み合わせです。
2-1. 主な検索条件
| 条件 | 意味 | 例 |
|---|---|---|
-name PATTERN |
ファイル名の一致(ワイルドカード可) | -name "*.log" |
-type TYPE |
種別:f=通常ファイル/d=ディレクトリ/l=シンボリックリンク/s=ソケット/b=ブロックデバイス |
-type l |
-size N |
サイズ。単位はc(バイト)・k(KiB)・M(MiB)・G(GiB)。+で以上、-で未満、無記号で完全一致 |
-size +100M |
-mtime N |
最終更新時刻(modify time)。-7=7日以内、+30=30日超 |
-mtime -7 |
-atime N |
最終アクセス時刻(access time) | -atime +30 |
-ctime N |
最終ステータス変更時刻(所有者・権限などメタデータの変更) | -ctime -1 |
-user NAME |
所有者が一致(UID番号なら-uid) |
-user test |
-perm MODE |
パーミッション指定(詳細は次節) | -perm 775 |
-maxdepth N |
探索する最大深さ。1=直下のみ |
-maxdepth 2 |
-mindepth N |
探索する最小深さ。2=孫以降のみ |
-mindepth 2 |
-mtime/-atime/-ctimeの覚え分け・
-mtime=modify(ファイル内容の更新)・
-atime=access(読み取りアクセス)・
-ctime=change(権限・所有者などメタデータ変更)3つとも日数単位。試験では選択肢にまとめて並び、説明を入れ替えて出題されます。
2-2. -permの3種類の指定
パーミッションは単なる数値比較ではなく、プレフィックス記号で意味が変わります。試験頻出のポイントです。
| 書式 | 意味 |
|---|---|
-perm 775 |
完全一致。パーミッションがちょうど 775 のもの |
-perm -775 |
最低でも指定ビットをすべて含むもの(他のビットは立っていてもよい) |
-perm /775 |
指定ビットのいずれかが立っているもの |
例えばカレント以下からちょうど775のディレクトリを探したいときはfind . -perm 775 -type d。頭に-や/を付けると意味が変わります。
2-3. アクション:-print/-print0/-exec
| アクション | 意味 |
|---|---|
| (省略) | デフォルトで-print相当 |
-print |
マッチしたパスを改行区切りで標準出力に表示 |
-print0 |
マッチしたパスをNULL文字(\0)区切りで出力。スペースや改行を含むファイル名をxargs -0と連携する際に安全 |
-exec CMD {} \; |
マッチしたファイルごとにコマンドを実行。{}はファイルパスのプレースホルダ、\;はコマンド終端 |
-exec CMD {} + |
複数まとめて1回で実行(高速) |
# /etc 以下から httpd.conf を探す
$ find /etc -name httpd.conf
# カレント以下からシンボリックリンクだけ列挙
$ find . -type l
# /home 以下の所有者が test のエントリ
$ find /home -user test
# カレント以下の各ファイルの単語数を表示
$ find . -type f -exec wc -w {} \;
# スペースを含むファイル名も安全にパイプで渡す
$ find /var/log -type f -print0 | xargs -0 ls -lh
find ... | wc -wと-exec wc -w {} \;は別物前者は「見つかったパス文字列の単語数」、後者は「各ファイルの中身の単語数」。試験では引っかけとして並びます。
3. locateとupdatedb:DB型の高速検索
locateはあらかじめ構築されたファイル名データベースを照会するため、findより圧倒的に高速です。ただしDB更新後に作成されたファイルは見つかりません。
# ファイル名にキーワードを含むものを検索
$ locate syslog
# データベースを手動で更新(通常は cron で日次)
$ sudo updatedb
3-1. updatedbとその設定ファイル
DBを作成・更新するコマンドがupdatedb。動作の設定は/etc/updatedb.confで制御します。
| 設定項目 | 意味 |
|---|---|
PRUNEFS |
インデックス対象から除外するファイルシステム種別 |
PRUNEPATHS |
除外するパス |
PRUNENAMES |
除外するディレクトリ名 |
$ cat /etc/updatedb.conf
PRUNEFS="NFS nfs nfs4 afs autofs proc sysfs tmpfs ..."
PRUNEPATHS="/tmp /var/spool /media ..."
PRUNENAMES=".git .hg .svn"
updatedblocate -U/locate --update/rebuilddbといった紛らわしい選択肢が並ぶことがありますが、正解は単独コマンドのupdatedbです。
4. コマンドの場所を調べる:type/which/whereis
「このコマンドの正体・所在を知りたい」ときに使う3つのコマンド。選択肢として並んで「正しいのはどれ」を問う出題が定番です。
| コマンド | 何を返すか | 情報源 |
|---|---|---|
which |
環境変数$PATH上で最初にヒットした実行ファイルの絶対パス |
$PATHを走査 |
whereis |
バイナリ・ソース・マニュアルページの場所をまとめて絶対パスで表示 | 標準パスを探索 |
type |
コマンドの種別(alias/builtin/function/file/keyword)と、外部コマンドなら実体パス | シェル内部 |
$ which ls
/usr/bin/ls
$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
$ type ls
ls is aliased to 'ls --color=auto'
$ type cd
cd is a shell builtin
$ type -t ls
alias
4-1. type -tが返す種別
type -tはコマンドの種別を1語で返します。返り値の集合は決まっています。
| 返り値 | 意味 |
|---|---|
alias |
エイリアス |
builtin |
シェル組み込みコマンド(cdなど) |
function |
シェル関数 |
file |
外部実行ファイル |
keyword |
シェル予約語(if・forなど) |
libraryは返らない共有ライブラリはそもそもコマンド実行対象ではないため、
type -tの返り値集合には含まれません。引っかけ選択肢として並ぶので注意。
4-2. 3コマンドの使い分け
cpのパスを知りたい→which cpまたはwhereis cp。whichはPATH上の先頭の1件、whereisはバイナリ・ソース・manをまとめて。lsが alias かどうか知りたい→type ls。whichでは alias 判定は確実に得られません。- マニュアルの場所も知りたい→
whereisが最速(バイナリと同時に/usr/share/man/man1/...を返す)。
5. FHS(Filesystem Hierarchy Standard)
FHSはLinux系OSで「どのディレクトリに何を置くか」を取り決めた業界標準仕様です。ディストリビューション間での移植性を高める目的で策定されており、Ubuntu・RHELなどどの環境でも基本的に同じ配置になります。
FHSで定めているのはディレクトリの用途・配置ルールであって、以下ではない点に注意します。
- ✘ Linuxカーネル内部の実装ではない(ユーザ空間の取り決め)
- ✘ ext4/xfsなどのファイルシステム形式そのものではない
具体的には「/etcは設定ファイル」「/varは可変データ」「/tmpは一時ファイル」といった配置の基本ルールを定めています。
6. FHS 主要ディレクトリ
6-1. コマンド格納ディレクトリの4分類
コマンドは「起動時に必須か/ローテーション後のユーザ領域か」と「一般ユーザ向けか/管理者向けか」の2軸で4つに分けて置きます。試験で頻出の対比。
| 一般ユーザ向け | システム管理者(root)向け | |
|---|---|---|
| 起動に必須 | /bin( ls/cp/mv/cat等) |
/sbin( fsck/shutdown等) |
| 起動には必須でない | /usr/binパッケージ導入のコマンド多数 |
/usr/sbin( useradd/fdisk/mkfs等) |
さらに、管理者が自分でビルド・導入したソフトウェアは/usr/local配下(/usr/local/bin・/usr/local/sbinなど)に置きます。パッケージ管理下のものと分離する設計です。
6-2. 共有ライブラリ:/libと/usr/lib
コマンドが依存する共有ライブラリは/libおよび/usr/libに格納されます。コマンド側の配置と対応関係があります。
| ライブラリ置き場 | 誰が使う |
|---|---|
/lib |
/bin・/sbinのコマンドが使う共有ライブラリ |
/usr/lib |
/usr/bin・/usr/sbinのコマンドが使う共有ライブラリ |
/var/libは別物/var/libは「サービスが実行中に書き込む可変状態データ」の置き場所で、共有ライブラリの置き場所ではありません。名前が似ているので試験で引っかけに使われます。
6-3. マニュアルページ:/usr/share/man
manコマンドで参照されるマニュアルページの実体は/usr/share/man配下にあります。セクション番号ごとにman1・man5・man8などのサブディレクトリがあり、ls.1.gzのような圧縮ファイルで格納されています。
6-4. その他の主要ディレクトリ
| パス | 用途 |
|---|---|
/etc |
設定ファイル(ホスト固有)。/etc/passwd・/etc/fstab・/etc/updatedb.conf等 |
/var |
可変データ(ログ・スプール・DB)。/var/log・/var/spool等 |
/tmp |
一時ファイル(再起動で消える想定) |
/home |
一般ユーザのホームディレクトリ |
/usr/local |
管理者がローカルに追加したソフトウェア(パッケージ管理に乗らないもの) |
7. よくある質問(FAQ)
Q. locateで「見つからない」のにfindだと見つかる
DBが古い可能性大。sudo updatedbでDBを最新化してから再試行してください。locateは最後のDB更新時点のスナップショットを返すため、それ以降に作ったファイルは見えません。
Q. find . -perm 775と-perm -775は何が違う?
前者は「ちょうど775」の完全一致、後者は「最低でも775のビットを含む」という意味です。-perm /775なら「指定ビットのいずれかが立っている」。同じ数値でもプレフィックスで意味が変わります。
Q. type -t lsでlibraryが返ってくることはある?
ありません。type -tの返り値は alias / builtin / function / file / keyword のいずれか。共有ライブラリは実行コマンドではないので対象外です。
Q. 管理者が自分でビルドしたコマンドはどこに置くのが標準?
/usr/local/bin(一般ユーザ向け)または/usr/local/sbin(root向け)。パッケージ管理で入る/usr/bin・/usr/sbinとは分離する設計になっています。
Q. find ... | wc -wで各ファイルの単語数を数えられる?
数えられません。それは「ファイル名文字列の単語数」になります。各ファイルの中身を数えるにはfind . -type f -exec wc -w {} \;のように-execでwcを呼び出します。
8. まとめ
find 開始パス 条件 アクションが基本。-name/-type/-size/-user/-perm/-mtime/-atime/-maxdepth/-mindepthを組み合わせる-perm 775=完全一致、-perm -775=最低ビット、-perm /775=いずれか-exec CMD {} \;で各ファイルにコマンド実行、-print0はNULL区切りでxargs -0と連携locate=DB検索で高速、updatedbでDB更新、設定は/etc/updatedb.conf(PRUNEFS/PRUNEPATHS/PRUNENAMES)which=PATH上の実体パス、whereis=バイナリ・ソース・man、type=種別(-tは alias/builtin/function/file/keyword)- FHS:
/binと/sbin=起動必須、/usr/binと/usr/sbin=起動非必須、/usr/local=ローカル追加分 - 共有ライブラリは
/lib(/bin・/sbin用)と/usr/lib(/usr/bin・/usr/sbin用)。マニュアルは/usr/share/man
📚 LinuC Level1 完全攻略マップへ戻る。
9. 模擬問題にチャレンジ(ランダム出題)
ここまでの内容を本試験に近い形で確認できます。問題数を選んで「出題スタート」を押すと、主題1.02.4の問題プールからランダムに出題されます。選択肢をクリック/タップすると、正誤と解説がその場で表示されます。
合格ライン目安:75%以上。間違えた設問は本文の該当章(2章のfind条件、3章のupdatedb、6章のFHSなど)に戻って知識を補強しましょう。もっと幅広く解きたい場合はLinuC 模擬問題ポータルから他の分野にも挑戦できます。
隣接副主題:ファイルの所有者とパーミッション(1.02.1) / ハードリンクとシンボリックリンク(1.02.3)。全体マップは LinuC Level1 完全攻略|主題別学習マップ から。



コメント