find コマンド
概要
find - ファイルを探すコマンドライン
find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
対象バージョン
- RHEL 10 : GNU find 4.10.0
- Ubuntu 24.04 : GNU find 4.9.0
説明
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 オプションを指定するとシンボリックリンク先も検索するようになります。-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
- EXPR1 と EXPR2 の両方が真であれば真となります(AND)。
- EXPR1 -a EXPR2
-andと同等です。- EXPR1 -or EXPR2
- EXPR1 と EXPR2 のどちらか片方が真であれば真となります(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 -print0やls --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が実行されます。$ 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 で使用可能なフォーマットは下記です。
\a: ベル(BEL)\b: バックスペース(BS)\c: フォーマットを終了して出力をフラッシュ\f: フォームフィード(FF)\n: ニューライン(LF)\r: キャリッジリターン(CR)\t: 水平タブ(TAB)\v: 垂直タブ(VT)\0: ヌル文字(NUL)\\: バックスラッシュ(\)\NNN: 8進数の文字コード%%: パーセント(%)%p: パス名%P: パス名(引数で指定したパス名を削除した部分)%h: ディレクトリ名%f: ファイル名%l: シンボリックリンク先ファイル名%t: 最終更新日時%c: 最終変更日時%a: 最終参照日時%Bk: ファイルシステムがサポートしていれば作成日時。kは下記参照。%Tk: 最終更新日時。kは下記参照%Ck: 最終変更日時。kは下記参照%Ak: 最終参照日時。kは下記参照%s: ファイルサイズ(バイト単位)%b: 使用するディスクスペース(512バイトブロック単位)%k: 使用するディスクスペース(1KB=1024バイト単位)%S: マニュアルにはディスク使用率(0.0..1.0)とありますが実装は異なるみたい%d: 階層の深さレベル%u: ユーザー名%U: ユーザーID%g: グループ名%G: グループID%m: パーミッション(例:755)%M: パーミッション(例:drwxr-xr-x)%H: ファイル探索の開始ポイント(findコマンドに指定したパス名のいずれか)%F: ファイルシステムタイプ(例:ext4)%y: ファイルタイプ(f:通常ファイル, d:ディレクトリなど)%Y: %y ど同様だがシンボリックリンク先のタイプを表示(L:Loop, N:Nonexistent, ?:Other)%i: iノード番号%D: ファイルシステム番号(stat()のst_dev値)%n: ハードリンク数%Z: SELinuxのセキュリティコンテキスト
%Bk, %Ak, %Ck, %Tk の k には下記のいずれか1文字を指定します。
c: 日時(ロケール依存)(例:Mon Jul 14 10:32:43 2025)+: 日時(yyyy-mm-dd+hh:mm:ss.xxxxxxxxxx)F: 日付(yyyy-mm-dd)D: 日付(mm/dd/yy)x: 日付(ロケール依存)(mm/dd/yy)X: 年(4桁)(1970..)y: 年(2桁)(00..99)m: 月(01..12)b: 月(ロケール依存)(Jan..Dec)h: 月(bと同じ)(Jan..Dec)B: 月(ロケール依存)(January..December)d: 日(01..31)a: 曜日(ロケール依存)(Sun..Sat)A: 曜日(ロケール依存)(Sunday..Saturday)w: 曜日(0..6)X: 時刻(ロケール依存)(hh:mm:ss.xxxxxxxxxx)T: 時刻(hh:mm:ss.xxxxxxxxxx)r: 時刻(hh:mm:ss [AM|PM])H: 時間(00..23)I: 時間(01..12)k: 時間(0..23)l: 時間(1..12)p: AM または PM(ロケール依存)M: 分(00..59)S: 秒(00.0000000000..61.0000000000)@: 1970-01-01 00:00:00 GMT からの秒数j: 1年の中の日数(001..366)U: 1年の中の週数(日曜開始)(00..53)W: 1年の中の週数(月曜開始)(00..53)Z: タイムゾーン(例:JST)
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 では下記のワイルドカードを使用できます。
*: 0文字以上の任意文字列?: 1文字の任意文字[A-Z]: A~Z のいずれかの文字[ABC]: A または B または C[!ABC]: A, B, C 以外の文字**: 任意階層のディレクトリ(-pathの場合)
下記は使用できません。
{A,B,C}: A または B または C