find コマンド

目次

概要

find - ファイルを探す

コマンドライン

find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]

対象バージョン

説明

path... で指定したディレクトリやファイルから expression で指定した条件にマッチしたファイルを階層的に探します。探したファイルに対してコマンドを実行することもできます。

主な使用例

ファイル名で検索する(-name)

-name でファイル名を指定して検索することができます。*? などの ワイルドカード を使用することができます。下記の例では /etc ディレクトリ配下にある *.conf の拡張子を持つファイルを探して表示します。

$ find /etc -name "*.conf"
/etc/ld.so.conf
/etc/dnf/protected.d/setup.conf
/etc/dnf/protected.d/systemd.conf
  :

パス名で検索する(-path)

-path でパス名を指定して検索することができます。

$ find /etc -path "/etc/*/*.conf"
/etc/dnf/protected.d/setup.conf
/etc/dnf/protected.d/systemd.conf
/etc/dnf/protected.d/almalinux-release.conf
  :

更新日時で検索する(-mtime, -ctime, -catime, ...)

下記の例では現在時刻より3日以内に更新されたファイルを検索します。

$ find . -mtime -3

-3 とすると3日未満、+3 とすると3日より前、3 とすると丁度3日前となります。

$ find . -mtime -3         # 3日前より後に更新されたファイル
$ find . -mtime +3         # 3日前より前に更新されたファイル
$ find . -mtime 3          # 3日前に更新されたファイル

-mtime は最終更新日時、-ctime は最終変更日時、-atime は最終参照日時で検索します。更新はファイルの中身が書き換わること、変更は中身が書き換わったり、パーミッションが変更されることを意味します。

$ find . -mtime -3         # 3日未満に更新されたファイル
$ find . -ctime -3         # 3日未満に変更されたファイル
$ find . -atime -3         # 3日未満に参照されたファイル

-mmin, -cmin, -amin を用いると日数ではなく分単位で指定できます。

$ find . -mmin -10         # 10分未満に更新されたファイル
$ find . -cmin -10         # 10分未満に変更されたファイル
$ find . -amin -10         # 10分未満に参照されたファイル

-newer, -cnewer, -anewer を用いると指定したファイルと比較します。

$ find . -newer file.log   # file.logよりも後に更新されたファイル
$ find . -cnewer file.log  # file.logよりも後に変更されたファイル
$ find . -anewer file.log  # file.logよりも後に参照されたファイル

ファイル種別で検索する(-type)

-type でファイル種別を絞ることができます。種別には f(通常ファイル)、d(ディレクトリ)、l(シンボリックリンクファイル)、b(ブロックデバイス)、c(キャラクタデバイス)、p(FIFOパイプ)、s(ソケット) のいずれかを指定します。

$ find . -type f           # 通常ファイルのみを検索する
$ find . -type d           # ディレクトリのみを検索する

検索されたファイルに対してコマンドを実行する(-exec)

-exec を使用すると検索結果のファイルに対して任意のコマンドを実行することができます。下記の例では /etc 配下にある *.conf ファイルに対して grep コマンドで memory という文字列を検索しています。-Hn はファイル名と行番号を表示することを意味します。{} は検索結果のファイル名を意味します。シェルから起動する際は末尾の ;\; の様にエスケープする必要があります。

$ find /etc -name "*.conf" -exec grep -Hn memoy {} \;

論理演算(-and, -or, -not)

-and, -or, -not で条件の AND, OR, NOT を指定することができます。下記の例では /etc 配下から *.conf または *.ini にマッチするファイルを検索しています。

$ find /etc -name "*.conf" -or -name "*.ini"

-a, -o, ! の省略形もあります。! はシェルのメタ文字なので \ でエスケープする必要があります。

$ find /etc -name "*.conf" -o -name "*.ini"

-and-or を記述しない場合は -and と見なされます。下記は同じ意味になります。

$ find /etc -type f -and -name "*.conf"
$ find /etc -type f      -name "*.conf"

(...) でグルーピングすることもできます。() はシェルのメタ文字なので \ でエスケープします。\(\) の前後にはスペースが必要です。

$ find /etc -type f \( -name "*.conf" -or -name "*.ini" \)

通常はシンボリックリンク先は検索しませんが、-L オプションを指定するとシンボリックリンク先も検索するようになります。-L オプションは path よりも前に記述する必要があります。

$ find -L .

コマンドオプション(-HLPOD)

コマンドオプションは path... よりも前に記述する必要があります。

-P
物理パスとして動作します。対象がシンボリックリンクファイルの場合、シンボリックリンクファイル自体を対象とします。
-L
論理パスとして動作します。対象がシンボリックリンクファイルの場合、シンボリックリンク先の情報を表示します。シンボリックリンク先が存在しない場合はシンボリックリンクファイル自体を対象とします。
-H
-L と似ていますが、シンボリックリンク先を参照するのは path で指定したファイルのみに限定します。
-Olevel
構文評価の最適化レベルを指定します。最適化を行うと式の評価順序が変更されるため、順序を意識すべき式では注意が必要です。
  • -O0 : 最適化を行いません。
  • -O1 : 基本的な最適化を行い、コストの低い式を優先的に評価します。
  • -O2 : 強力な最適化を行います。
  • -O3 : 最も強力な最適化を行います。
-D debugopts
デバッグ情報を出力します。debugopts には下記のキーワードをカンマ(,)区切りで指定します。
  • exec : -exec-ok に関する情報。
  • opt : 式の最適化に関する情報。
  • rates : 式の評価コスト推定に関する情報。
  • search : ディレクトリツリー探索に関する情報。
  • stat : ファイルの stat() や lstat() システムコールに関する情報。
  • tree : 式の階層構造に関する情報。
  • all : すべての情報。
  • help : debugopts に関する情報。

式(expression)

演算子

( EXPR )
EXPR をグルーピングします。() はシェルのメタ文字なので \(\) の様にエスケープする必要があります。
-not EXPR
EXPR が偽であれば真となります(NOT)。
! EXPR
-not と同等です。
EXPR1 -and EXPR2
EXPR1EXPR2 の両方が真であれば真となります(AND)。
EXPR1 -a EXPR2
-and と同等です。
EXPR1 -or EXPR2
EXPR1EXPR2 のどちらか片方が真であれば真となります(OR)。
EXPR1 -o EXPR2
-or と同等です。
EXPR1 , EXPR2
EXPR1 を評価した後、EXPR1 の結果(真偽)は破棄し、EXPR2 を評価します。結果(真偽)は EXPR2 の結果となります。-exec などのアクションを逐次実行する際などに役立ちます。

ポジショナルオプション

-daystart
-amin, -atime, -cmin, -ctime, -mmin, -mtime の基準時刻を現在時刻ではなく今日の 0時00分00秒 とします。
-follow
シンボリックリンク先も検索対象とします。
-warn
Permission denied. などの警告情報を表示します。
-nowarn
警告情報を表示しません。ただし、AlmaLinux 10 や Ubuntu 24.04 で試したところ、-nowarn を指定しても Permission denied. の警告情報は表示されてしまいました。
-regextype type
-regex-iregex で使用する正規表現のタイプを指定します。type には下記のいずれかを指定します。
  • findutils-default : findコマンド標準。
  • grep : grep コマンドタイプ。
  • egrep : egrep コマンドタイプ。
  • posix-egrep : POSIX egrep コマンドタイプ。
  • awk : awk タイプ。
  • gnu-awk : GNU awk タイプ。
  • posix-awk : POSIX awk タイプ。
  • sed : sed コマンドタイプ。
  • ed : edコマンドタイプ。
  • emacs : emacs タイプ。
  • posix-minimal-basic : POSIX最小限基本正規表現。
  • posix-basic : POSIX基本正規表現。
  • posix-extended : POSIX拡張正規表現。
  • help : この一覧を表示。

ノーマルオプション

-depth
ディレクトリの探索を浅いディレクトリから深いディレクトリではなく、深いディレクトリを優先的に処理します。old という名前のフォルダをすべて削除する際、親ディレクトリが先に削除され、その中の old サブディレクトリを削除しようとしてエラーとなるのを抑制する場合などで有効です。
$ find . -depth -name old -exec rm {} \;
-files0-from file
対象ディレクトリを path ではなく file から読み込みます。file は改行区切りではなく NUL 文字で区切られたファイルです。NUL 区切りのファイルは find -print0ls --zero などで作成できます。デリミタを NUL にすることにより、スペースや改行を含むファイルが存在していても安全に処理することができます。
$ ls -d --zero * > files
$ find -files0-from files
-maxdepth LEVELS
ディレクトリ探索の階層を最大 LEVELS 階層以下のものに制限します。
-mindepth LEVELS
ディレクトリ探索の階層を最低 LEVELS 階層以上のものに制限します。
-mount
他のファイルシステムを探索しません。df コマンドで表示されるファイルシステムに閉じた検索を行います。
-xdev
-mount と同等です。互換性のために残されています。
-noleaf
FAT, NTFS, NFS などのファイルシステムを探索する場合に必要です。通常 find コマンドはディレクトリがカレントディレクトリ(.) や親ディレクトリ(..)を保持していることを前提に検索の最適化を行いますが、FAT, NTFS, NFS などのファイルシステムではこの前提が満たされず処理結果が誤ることがあります。-noleaf を指定することにより正確に探索することが可能となります。
-xautofs
NFS や USBデバイスでは最初にアクセスが発生した際に自動マウント(autofs)されるものがあります。-xautofs オプションを指定することにより、自動マウントを抑制することができます。find 4.10 から利用可能です。
-ignore_readdir_race
find コマンドがファイルの一覧を読み取ってからそのファイルに対して stat() システムコールを行うまでの間に対象ファイルが削除された場合のエラーを抑止します。
-noignore_readdir_race
上記のエラーを抑止しません。

テストオプション

名前系

-name PATTERN
ファイル名が PATTERN にマッチした場合に真となります。*? などの ワイルドカード を使用できます。
$ find . -name "*.log"
-path PATTERN
ファイルのパス名が PATTERN にマッチする場合に真となります。PATTERN には *? などの ワイルドカード を使用できます。
$ find . -path "./*/*.log"
-wholename PATTERN
-path と同等です。GNU find でサポートされたものですが、POSIX では -path として標準化されました。
-regex PATTERN
ファイルのパス名が PATTERN にマッチする場合に真となります。PATTERN には正規表現を指定します。正規表現ルールは -regextype で変更することができます。
$ find . -regex '^\./dirA/.*'
-lname PATTERN
シンボリックリンク先の物理パス名が PATTERN にマッチする場合に真となります。*? などの ワイルドカード を使用できます。下記の例では /usr/bin ディレクトリ配下で /etc 配下のファイルに対するシンボリックリンクファイルを探索します。
$ find /usr/bin -lname "/etc/*"
-iname PATTERN
-name と同様ですが、大文字・小文字を無視する点が異なります。
-ipath PATTERN
-path と同様ですが、大文字・小文字を無視する点が異なります。
-iwholename PATTERN
-wholename と同様ですが、大文字・小文字を無視する点が異なります。
-iregex PATTERN
-regex と同様ですが、大文字・小文字を無視する点が異なります。
-ilname PATTERN
-lname と同様ですが、大文字・小文字を無視する点が異なります。

ファイルタイプ系

-type [bcdpflsD]
ファイル種別を指定します。
$ find . -type d
  • f : 通常ファイル
  • d : ディレクトリ
  • l : シンボリックリンク
  • b : ブロックデバイス
  • c : キャラクタデバイス
  • p : FIFOパイプファイル
  • s : ソケットファイル
  • D : Doorsファイル(Solarisのみ)
-xtype [bcdpfls]
-type とほぼ同様ですが、対象がシンボリックリンクファイルの場合の動作が異なります。-type d は対象自体がシンボリックリンクファイルの場合には偽となりますが、-xtype d はシンボリックリンク先のファイルタイプがディレクトリであれば真となります。

所有者系

-user NAME
ファイルの所有者が NAME である場合にマッチします。
$ find . -name yamada
-group NAME
ファイルのグループが NAME である場合にマッチします。
-uid N
ファイルの所有者のユーザーIDが N である場合にマッチします。
-gid N
ファイルのグループのグループIDが N である場合にマッチします。
-nouser
ファイルの所有者がすでに削除されたなどの理由で存在しない場合にマッチします。
-nogroup
ファイルのグループがすでに削除されたなどの理由で存在しない場合にマッチします。

ファイルサイズ系

-size N[bcwkMG]
ファイルサイズが N にマッチする場合に真となります。-10k は 10KB 未満、+10k は 10KB を超えるもの、10K は丁度 10K のものにマッチします。単位には下記を指定できます。単位省略時は b と見なします。
  • b : ブロック(512バイト)単位
  • c : ASCII文字(1バイト)単位
  • w : ワード(2バイト)単位
  • k : キロバイト(1024バイト)単位
  • M : メガバイト(1024*1024バイト)単位
  • G : ギガバイト(1024*1024*1024バイト)単位

時刻系

-mmin N
最終更新時刻を分単位で指定します。-10 は10分未満、+10 は10分を超えるもの、10 は丁度10分のものにマッチします。
-cmin N
最終変更時刻を分単位で指定します。-10 は10分未満、+10 は10分を超えるもの、10 は丁度10分のものにマッチします。
-amin N
最終参照時刻を分単位で指定します。-10 は10分未満、+10 は10分を超えるもの、10 は丁度10分のものにマッチします。
-mtime N
最終更新(modified)時刻を日で指定します。-10 は10日未満、+10 は10日を超えるもの、10 は丁度10日のものにマッチします。
-ctime N
最終変更(changed)時刻を日で指定します。-10 は10日未満、+10 は10日を超えるもの、10 は丁度10日のものにマッチします。
-atime N
最終参照(access)時刻を日で指定します。-10 は10日未満、+10 は10日を超えるもの、10 は丁度10日のものにマッチします。
-newer FILE
最終更新(modified)時刻が FILE で指定したファイルよりも新しいものにマッチします。
-cnewer FILE
最終変更(changed)時刻が FILE で指定したファイルよりも新しいものにマッチします。
-anewer FILE
最終参照(access)時刻が FILE で指定したファイルよりも新しいものにマッチします。
-used N
ファイルが変更された後に参照された時刻までの日数で指定します。-10 は10日未満、+10 は10日を超えるもの、10 は丁度10日のものにマッチします。

アクセス権系

-readable
find コマンド実行ユーザーが読込可能なファイルにマッチします。
-writable
find コマンド実行ユーザーが書込可能なファイルにマッチします。
-executable
find コマンド実行ユーザーが実行可能なファイル、もしくは移動可能なディレクトリにマッチします。
-perm [-/]MODE
ファイルのパーミッションが MODE にマッチする場合に真となります。- または / をつけると最低限指定した権限があればマッチします。つけない場合は完全一致した場合のみマッチします。
$ find . -perm 644         # 644 のものにマッチ
$ find . -perm -644        # 755 など 最低でも 644 の権限を含むものにマッチ
$ find . -perm /644        # -644 と同義
$ find . -perm g=w         # 020 のものにマッチ
$ find . -perm -g=w        # グループ書き込み権があればマッチ

セキュリティ系

-context CONTEXT
SELinux で設定されたセキュリティコンテキストが CONTEXT にマッチする場合に真となります。* などの ワイルドカード を使用できます。

その他系

-empty
通常ファイルの場合は空ファイルであれば、ディレクトリの場合は空ディレクトリであればマッチします。
-fstype TYPE
ファイルシステムタイプが TYPE の場合にマッチします。ファイルシステムタイプは -printf "%F %f\n" で確認することができます。
-inum N
iノード番号で検索します。-10 は 10 未満のもの、+10 は 10 より大きいもの、10 は 10 のものにマッチします。
-links N
リンクカウントで検索します。10 は 10 未満のもの、+10 は 10 より大きいもの、10 は 10 のものにマッチします。
-true
常に真を返します。
-false
常に偽を返します。

アクション

-print
対象ファイルを表示します。他のアクションがひとつも指定されていない場合は自動的に -print が実行されます。
$ find . -name "*.bak" -print
-printf FORMAT
対象ファイルを書式に従って出力します。詳細は フォーマット を参照してください。
$ find . -printf "%AF %AT %p\n"
-print0
対象ファイルを出力します。各ファイルは NUL 文字で区切られます。これは -files0-from オプションの入力にもなります。NUL をデリミタとすることで空白文字や改行文字を含むファイルがあっても安全に処理することができます。
$ find . -name "*.bak" -print > files.txt
-ls
対象ファイルを ls コマンドの -l オプションに似たフォーマットで表示します。
$ find . -ls
-fprint FILE
-print と同様ですが FILE で指定したファイルに出力します。
$ find . -fprint output.txt
-fprintf FILE FORMAT
-printf と同様ですが FILE で指定したファイルに出力します。
-fprint0 FILE
-print0 と同様ですが FILE で指定したファイルに出力します。
-fls FILE
-ls と同様ですが FILE で指定したファイルに出力します。
-delete
ファイルやディレクトリを削除します。削除に成功すると真を、失敗すると偽を返し、find コマンドの終了ステータスも 0 以外となります。-name などの条件式よりも前に記述してしまうと条件判断する前に削除してしまうので注意が必要です。ディレクトリの場合は中身が空である必要があります。-depth オプションが自動的に付加され、階層の深いものから削除しようとします。
$ find . -name "*.bak" -delete

old という名前のフォルダを、中身が空でない場合も、多階層になっている場合にもすべて削除するには下記の様にします。

$ find . -depth -name old -exec rm -rf {} \;
-prune
対象がディレクトリの場合ディレクトリの中身を探索しません。対象がファイルの場合そのファイルを無視します。-o オプションと組み合わせることにより、特定の条件にマッチする対象を除外することができます。下記の例では old という名前のディレクトリやファイルを除外した結果を表示します。
$ find . -name old -prune -o -print
-quit
探索を終了します。条件に合致するファイルがひとつでも見つかったら find コマンドをその時点で終了させるのに役立ちます。下記の例では *.bak にマッチするファイルがひとつでも見つかればそれを表示して終了します。
$ find /etc -name "*.conf" -print -quit
-exec COMMAND ;
対象ファイルに対して COMMAND を実行します。{} は対象ファイル名を示します。; はシェルのメタ文字のため、シェルから実行する場合は \; とする必要があります。
$ find /usr/bin -exec ls -ld {} \;
-exec COMMAND {} +
-exec ... ; と似ていますが、; を指定した場合は対象ファイル毎に毎回コマンドを起動するのに対して、+ を指定した場合は複数の対象をまとめてコマンドに引き渡します。これによりコマンドの起動回数を減らし処理を効率化することができます。{} はコマンドの最後に必須となります。
$ find /usr/bin -exec ls -ld {} +
-ok COMMAND ;
-exec ... ; と似ていますが、コマンドを実行する前に確認される点が異なります。
$ find /usr/bin -ok ls -ld {} \;
-execdir COMMAND ;
-exec ... ; と似ていますが、コマンド実行時に対象ファイルが存在するディレクトリに移動してからコマンドを実行する点が異なります。
-execdir COMMAND {} +
-exec ... + と似ていますが、コマンド実行時に対象ファイルが存在するディレクトリに移動してからコマンドを実行する点が異なります。
-okdir COMMAND ;
-ok ... ; と似ていますが、コマンド実行時に対象ファイルが存在するディレクトリに移動してからコマンドを実行する点が異なります。

その他オプション

-help, --help
ヘルプを表示して終了します。
-version, --version
バージョンを表示して終了します。

フォーマット

-printf で使用可能なフォーマットは下記です。

%Bk, %Ak, %Ck, %Tkk には下記のいずれか1文字を指定します。

24時間表記の秒の小数点以下を表示しないようにするには、下記の様にするしかないようです。

$ find . -printf "%AF %AT %p\n" | sed -E 's/\.[0-9]{10}//'
2025-07-14 14:52:29 .
2025-07-14 14:29:31 ./fileA
2025-07-14 14:29:31 ./fileB

ワイルドカード

-name-path では下記のワイルドカードを使用できます。

下記は使用できません。