Linuxファイル検索とFHS完全ガイド|find・locate・whereis・type・which【LinuC 1.02.4】

LinuC対策

この記事はLinuC Level1 副主題1.02.4「ファイルの配置と検索」に対応した要点解説です。試験で問われる範囲に絞り、findlocateupdatedbtypewhereiswhichの使い分けと、FHS(Filesystem Hierarchy Standard)の主要ディレクトリを整理しました。

📚 LinuC Level1 完全攻略マップ(全39サブ項目)へ戻る


目次

  1. この記事でできるようになること
  2. find:ファイルシステムを直接検索
  3. locateupdatedb:DB型の高速検索
  4. コマンドの場所を調べる:type/which/whereis
  5. FHS(Filesystem Hierarchy Standard)
  6. FHS 主要ディレクトリ
  7. よくある質問(FAQ)
  8. まとめ
  9. 模擬問題にチャレンジ(ランダム出題)

1. この記事でできるようになること

  • findの基本書式と主な検索条件(-name/-type/-size/-user/-perm/-mtime/-atime/-maxdepth/-mindepth)
  • findのアクション(-print/-print0/-exec)と使い分け
  • -permの数値指定(完全一致/最低ビット-/いずれか/)
  • locateupdatedb、設定ファイル/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. locateupdatedb: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"
⚠ DBを更新するコマンドはupdatedb
locate -Ulocate --updaterebuilddbといった紛らわしい選択肢が並ぶことがありますが、正解は単独コマンドの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 シェル予約語(ifforなど)
libraryは返らない
共有ライブラリはそもそもコマンド実行対象ではないため、type -tの返り値集合には含まれません。引っかけ選択肢として並ぶので注意。

4-2. 3コマンドの使い分け

  • cpのパスを知りたいwhich cpまたはwhereis cpwhichはPATH上の先頭の1件、whereisはバイナリ・ソース・manをまとめて。
  • lsが alias かどうか知りたいtype lswhichでは 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配下にあります。セクション番号ごとにman1man5man8などのサブディレクトリがあり、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 lslibraryが返ってくることはある?

ありません。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 {} \;のように-execwcを呼び出します。


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章のupdatedb6章のFHSなど)に戻って知識を補強しましょう。もっと幅広く解きたい場合はLinuC 模擬問題ポータルから他の分野にも挑戦できます。

隣接副主題:ファイルの所有者とパーミッション(1.02.1) / ハードリンクとシンボリックリンク(1.02.3)。全体マップは LinuC Level1 完全攻略|主題別学習マップ から。

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました