FINDコマンド
FINDの特徴
FINDコマンドは、ディレクトリ階層内のファイルやディレクトリを検索するツールである。FINDコマンドは条件を満たすファイルやディレクトリを見つけ出すことができ、検索条件を柔軟に指定できる。また、サブディレクトリを含めた再帰的な検索も可能であるとともに、一致したファイルへアクションを実行することもできる。
以下のファイルがあるディレクトリでいくつかfindコマンドを試してみる。
ll --time-style long-iso
(out)-rw-r--r-- 1 user user 10000 2025-02-21 00:04 file1.txt
(out)-rw-r--r-- 1 user user 500 2025-02-21 00:03 file2.txt
(out)-rw-r--r-- 1 user user 50 2025-02-21 00:02 file3.txt
(out)-rw-r--r-- 1 user user 1350 2025-02-21 00:01 file4.txt
(out)-rw-r--r-- 1 user user 5000 2025-02-21 00:00 file5.txt
(out)-rw-r--r-- 1 user user 1001 2025-02-20 23:59 file6.txt
(out)-rw-r--r-- 1 user user 0 2025-02-20 23:58 file7.txt
(out)-rw-r--r-- 1 user user 420 2025-02-20 23:57 file8.txt
(out)-rw-r--r-- 1 user user 1200 2025-02-20 23:56 file9.txt
find -size +1000c # サイズが1000バイト超の項目を探す
(out)./file1.txt
(out)./file4.txt
(out)./file5.txt
(out)./file6.txt
(out)./file9.txt
find -size +1k # サイズが1KiB超の項目を探す
(out)./file1.txt
(out)./file4.txt
(out)./file5.txt
(out)./file9.txt
date --iso-8601="seconds" # 本コマンドは2/21に実行した
(out)2025-02-21T13:53:18+09:00
find -daystart -mtime -1 # 更新日が今日の項目を探す
(out)./file1.txt
(out)./file2.txt
(out)./file3.txt
(out)./file4.txt
(out)./file5.txt
find -name '*3*' # 名前に3が含まれるファイルを探す
(out)./file3.txt
find -regex '.*[3-5].*' # パスに3~5が含まれる項目を探す
(out)./file3.txt
(out)./file4.txt
(out)./file5.txt
結果の表示順
findコマンドの結果はinode番号順に表示される。並び替えを行いたいときは他のコマンドへパイプで渡す。ファイル名以外で並び替えたいときは、後述のprintを使用して並び替えに使いたいキー情報を出力すると良い。
構文
find [オプション] [検索開始場所] 式...
findコマンドは検索開始場所の配下にある各ファイルについて式を評価し、式の結果が真であるものを標準出力へ出力する。
式
式は検索方法を定めるものである。式は動作によってテストやアクションなどに分類され、基本的には真または偽の結果になる。
アクション
現在の検索対象について何らかの操作を行う式をアクションと呼ぶ。主なアクションを示す。アクションも式の結果を返す。
アクション | 説明 | 実行後の値 |
---|---|---|
-print -print0 | ファイル名を標準出力に改行区切りで出力する。 print0はヌル文字(\0)区切りにする。 | 真 |
-fprint filename -fprint0 filename | ファイル名をfilenameに改行区切りで出力する。 print0はヌル文字(\0)区切りにする。 | 真 |
-exec command ; | 指定したコマンドを実行する。 コマンド中の{}はファイル名で置き換えられる。 コマンドはfindを実行したディレクトリで行われる。 | コマンドの戻り値が0なら真 |
-execdir command ; | 指定したコマンドを実行する。 コマンド中の{}はファイル名で置き換えられる。 コマンドはファイルがあるディレクトリで行われる。 | コマンドの戻り値が0なら真 |
-exec command + -execdir command -exec command + -execdir command | 指定したコマンドをまとめて実行する。 コマンド中の{}はファイル名のリストで置き換えられる。 コマンドが実行される場所はexec/execdir ;と同じである。 | 真 |
-ok command ; | -execに似ているが、実行前にユーザに確認する。 | ユーザが実行を拒否したら偽 |
-okdir command ; | -execdirに似ているが、実行前にユーザに確認する。 | ユーザが実行を拒否したら偽 |
-printf format -fprintf filename format | 見つかったファイルの情報を指定したフォーマットで出力する。 fprintfはファイルに出力する。 | 真 |
-ls -fls filename | ファイルをls -dils 形式で標準出力に表示する。flsはファイルに出力する。 | 真 |
-prune | ディレクトリを探索対象から除外する。 詳細は指定サブフォルダの除外を参照。 | 真 |
-delete | 見つかったファイルを削除する。 | 削除が成功したら真 |
-quit | すぐに終了する。 | - |
デフォルトのprint
findは式の結果が真となった検索対象についてデフォルトで-printアクションを実行する。ただし式の中に-pruneと-quitを除いたアクションが含まれている場合はデフォルトの-printは実行されなくなり、明示的に指定しなければならない。
エスケープ
一般にexec/execdir/ok/okdirの;および+はシェルで解釈されるためエスケープが必要である。
出力
print、print0、fprint、fprint0はファイル名を出力するアクションである。また、printf、fprintfは指定のフォーマットでファイルに関する情報を出力できる。
print/print0/fprint/fprint0
ファイル名を出力する。ファイル名は「検索開始場所」に指定した文字列から始まる相対パスとなる。
find .. # 検索開始場所は ..
(out).. # 出力されるファイル名は .. から始まるパス
(out)../.profile # 出力されるファイル名は .. から始まるパス
出力先はprint/print0が標準出力、fprint/fprint0が指定の参照先となる。
find . -fprint result.txt
less result.txt
(out).
(out)./file6.txt
(out)./file3.txt
ナル区切りの出力
ファイル名には様々な文字を含めることができる。改行コードさえ含めてもよい。しかし、そのような文字がファイル名に含まれるのはまれであるため、それが問題を引き起こすことは少ない。そのようなファイルがある場合には処理に注意が必要である。print/fprintではナル文字区切りで出力するアクション-xxxx0が用意されている。
printf/fprintf
printf/fprintfではファイル名だけでなく、指定のフォーマットで出力する内容を指定できる。これを使うと、findの出力結果をアクセス時刻でソートするなどがしやすくなる。
find . -printf '%m %f %s\n'
(out)755 . 4096
(out)644 file6.txt 1001
(out)644 file3.txt 50
(out)644 file9.txt 1200
フォーマットで指定できる主な指定子を示す。
分類 | 指定子 | 説明 | 指定子 | 説明 |
---|---|---|---|---|
名前 | %f | ファイル名 | %h | ファイルがあるディレクトリの相対パス |
%p | 検索開始場所に指定した文字列から始まる相対パス | %P | 検索開始場所からみた相対パス | |
日時 | %AFT%AH:%AM:%As(%AZ) | 最終アクセス時刻(ISO風) | %TFT%TH:%TM:%Ts(%TZ) | 最終更新時刻(ISO風) |
%CFT%CH:%CM:%Cs(%CZ) | 最終変更時刻(ISO風) | |||
%Ak | 最終アクセス時刻のうちkの部分 | %a | 最終アクセス時刻(ctime形式) | |
%Bk | 作成時刻のkで指定する部分 | |||
%Ck | 最終変更時刻kで指定する部分 | %c | 最終変更時刻(ctime形式) | |
%Tk | 最終更新時刻kで指定する部分 | %t | 最終更新時刻(ctime形式) | |
サイズ | %s | ファイルのサイズ(バイト単位) | ||
%b | ファイルのディスク使用ブロック数 | %k | ファイルのディスク使用キロバイト数 | |
所有者 | %u | ファイルの所有者名 | %U | ファイルの所有者ID |
%g | ファイルのグループ名 | %G | ファイルのグループID | |
%m | ファイルのパーミッション (644のような数値形式) | %M | ファイルのパーミッション (-rwxr--r--形式) | |
場所 | %H | 検索開始場所 | %d | 検索開始場所からの深さ |
%l | シンボリックリンクの参照先 | %n | ハードリンクの数 | |
タイプ | %y | ファイルの種類 (シンボリックリンクはl) | %Y | ファイルの種類 (シンボリックリンクはターゲットの種類) |
その他 | %i | ファイルのinode番号 | %Z | SELinuxコンテキスト |
%D | ファイルがあるデバイスのデバイス番号 | %F | ファイルがあるデバイスのファイルシステム | |
\n | 改行 | \t | タブ | |
\\ | バックスラッシュ | %% | パーセント記号 | |
\0 | ナル |
時刻の書式k
%Ak
、%Bk
、%Ck
、%Tk
のkに入る指定を以下に示す。
分類 | k | 意味 | k | 意味 |
---|---|---|---|---|
複合 | F | yyyy-mm-dd | T | hh:mm:ss.sss |
年 | Y | 西暦 | y | 西暦下2桁 |
月 | m | 月(01..12) | ||
h | 月名(ロケール依存の省略表記、Jan...Decなど) | H | 月名(ロケール依存) | |
日 | d | 日 | j | 年間通算日 |
時 | H | 時間(24時間表記、0埋め) | k | 時間(24時間表記) |
I | 時間(12時間表記、0埋め) | l | 時間(12時間表記) | |
分 | M | 分 | ||
秒 | S | 秒(小数部を含む) | ||
他 | a | 曜日(ロケール依存の短縮表記) | A | 曜日(ロケール依存) |
p | AM/PM(ロケール依存) | Z | タイムゾーン | |
@ | ユニックス秒 |
-ls/-fls
lsコマンドの結果をls -dilsフォーマットで出力する。
find -size +0c -ls
(out) 38445 4 -rw-r--r-- 1 user user 2 Feb 23 13:29 ./test2.txt
コマンドの実行
-exec/-execdir
コマンドを実行する。{}が見つかったファイル名に置換される。一般に、find condition -exec command ;のようにすることで、条件を満たしたファイルに対してコマンドを実行する。
今の階層にある4000バイト超のファイルについてスタットを表示する例を示す。
find -maxdepth 1 -size +4000c -exec stat {} \;
(out) File: .
(out) Size: 4096 Blocks: 8 IO Block: 4096 directory
(out)Device: 8,48 Inode: 49322 Links: 5
(out)Access: (0755/drwxr-xr-x) Uid: ( 1000/ user) Gid: ( 1000/ user)
(out)Access: 2025-02-23 11:37:22.034708898 +0900
(out)Modify: 2025-02-23 11:37:16.766647388 +0900
(out)Change: 2025-02-23 11:37:16.766647388 +0900
(out) Birth: 2025-02-22 01:43:38.948709485 +0900
execはfindを実行した場所で指定されたコマンドを実行する。execdirは見つかったファイルの場所に移動してからコマンドを実行する。
-ok/-okdir
コマンドを実行するかユーザに確認する。yで始まる入力でコマンドを実行する。okとokdirの違いはexecとexecdirと同じである。コマンド実行をスキップすると式の結果は偽となるので、スキップした場合に何らかの処理を行うこともできる。
find .. -maxdepth 2 -type f -size +4000c \( -ok stat {} \; -o -printf 'skipped!\n' \)
(out)< stat ... ../find/file1.txt > ? no # noと入力
(out)skipped!
(out)< stat ... ../find/file5.txt > ? Year! # Year!と入力
(out) File: ../find/file5.txt
(out) Size: 5000 Blocks: 16 IO Block: 4096 regular file
(out)Device: 8,48 Inode: 49460 Links: 1
(out)Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
(out)Access: 2025-02-21 00:00:00.000000000 +0900
(out)Modify: 2025-02-21 00:00:00.000000000 +0900
(out)Change: 2025-02-22 13:52:11.270869548 +0900
(out) Birth: 2025-02-22 13:45:12.964413894 +0900
削除
-delete
ファイルを削除する。削除に成功したら真となり、権限エラーなどで失敗した場合は偽となる。サイズが0バイトのファイルを削除し、結果を表示する例を示す。
find -type f -size 0c \( -delete -printf 'Deleted:%f\n' -o -printf 'Error:%f\n' \)
(out)Deleted:test1.txt
オペレータ
オペレータは式と組み合わせて使う演算子である。
例 | 意味 |
---|---|
-not expression ! expression | 式の結果を否定する。 |
expresion1 expression2 expression1 -a expression2 expression1 -and expresion2 (非推奨) | 式をAND結合する。 -a、-andで明示できる。 |
expression1 -o expression2 expression1 -or expresion2 (非推奨) | 式をOR結合する。 |
( expression1 -o expression2 ) -a expression3 | 式の評価順序を指定する。 |
expression1, expression2 | 式を列挙する。 expression1、expression2の順に評価され、expression2の値を返す。expression1の結果は無視される。 |
たとえば条件 -a アクション
のような式を書けば、条件を満たしたときにアクションを実行できる。
テスト
対象を評価するのがテスト式である。主なテスト式を示す。
条件 | 説明 |
---|---|
-name filename -iname filename | ファイル名が指定のパターンと一致するファイルを検索する。inameでは大文字と小文字を区別しない。 パターンではシェルのワイルドカード(.と*)が使用できる。 |
-regex regex | パスが正規表現と一致する。ファイル名だけでなく、パスも検索対象であり、完全一致であることに注意する。 -regextype regexmodeと併用すると正規表現の種類を指定できる。 |
-type type | 対象の種類で検索する。f (ファイル)、d (ディレクトリ)、l (シンボリックリンク)など |
-size size | サイズで検索する。単位として以下が使用可能。b (ブロック:単位省略時のデフォルト)c (バイト)k (キロバイト)M (メガバイト)G (キロバイト) |
-mtime days -ctime days -atime days | 最終更新日時(mtime)、最終変更日時(ctime)、最終アクセス日時(atime)で検索する。 |
最終変更日時
本稿ではmtimeを最終更新日時、ctimeを最終変更日時としている。
パス・ファイル名のテスト
-name/-iname
ファイル名が指定のワイルドカードパターン(.と*が使用可能)と一致する項目を検索する。inameは大文字と小文字を区別しない。
find -name '*1*'
(out)./search1.txt
-path/-ipath/-wholename/-iwholename
※互換性の観点から-path/ipathの利用が推奨される。
パスが指定のワイルドカードパターンと一致する項目を検索する。findにおけるパスは、検索する項目の絶対パスではなく検索開始場所から見たパスを指していることに注意すること。
find .
(out).
(out)./abc
(out)./abc/123
find abc
(out)abc
(out)abc/123
find . -path '*/abc/123'
(out)./abc/123
find abc -path '*/abc/123'
-regex/-iregex
パスが正規表現と一致するか検索する。ファイル名だけでなく、パスも検索対象となる。iregexは大文字と小文字を区別しない。
find -regex '.*[7-9].*'
(out)./search9.txt
(out)./search8.txt
(out)./search7.txt
パス全体が正規表現に一致するかを評価するため、789のどれかがパスに含むものを探すときは.*[7-9].*
のように前後に.*を付けなければならない。
-regextypeオプションを使用すると正規表現の種類を指定できる。posix-extendedを使用すると拡張正規表現が使用できる。
find -regex ".*\(7\|8\).*"
(out)./search8.txt
(out)./search7.txt
find -regextype posix-extended -regex ".*(7|8).*"
(out)./search8.txt
(out)./search7.txt
日時属性のテスト
-mtime/-ctime/-atime/-mmin/-cmin/-amin
現在時刻を基準とした、最終更新日時(Modified)、最終変更日時(Changed)、最終アクセス日時(Accessed)の経過日数または経過分数が条件を満たすか指定する。


指定値 | xtime | xmin |
---|---|---|
n | 経過時間がn日以上n+1日未満 | 経過時間がn-1分以上n分未満 |
+n | 経過時間がn日以上 | 経過時間がn-1分以上 |
-n | 経過時間がn日未満またはn日になった瞬間 | 経過時間がn分未満 |
更新日時が24時間~72時間のものを検索するときは、「経過時間が1日以上かつ3日未満となるので」なので-xtime +1 -mtime -3
のようになる。
-daystart
-daystartオプション以降に現れる-xtimeでは、経過時間ではなく「00:00に達したら1日経過した」と考える。例えば現在時刻が2/10 5:00のときは以下のようになる。
タイムスタンプの範囲 | 経過日数 |
---|---|
2/10 00:00:01 ~ 2/11 00:00:00 | 0日 |
2/09 00:00:01 ~ 2/10 00:00:00 | 1日 |
2/08 00:00:01 ~ 2/09 00:00:00 | 2日 |
(本表は少数単位の秒数を考慮していない)
-Nのようにマイナスが付けられた場合は「経過日数がN日に満たないまたはN日になった瞬間」と解釈される。つまり-1なら当日の00:00:00以降が条件を満たすことになるので、要は「今日の日付」という意味である。実際にfile1が表示されなくなる実行例を示す。
date --iso-8601="seconds"
(out)2025-02-22T03:24:37+09:00
find -mtime -1 -printf '%TF %TX %p\n'
(out)2025-02-21 23:59.0000000000 ./file1.txt
(out)2025-02-22 00:00.0000000000 ./file2.txt
(out)2025-02-22 00:01.0000000000 ./file3.txt
find -daystart -mtime -1 -printf '%TF %TX %p\n'
(out)2025-02-22 00:00.0000000000 ./file2.txt
(out)2025-02-22 00:01.0000000000 ./file3.txt
-newer/-anewer/-cnewer
参照先のタイムスタンプと比べて新しいかを調べる。-newerは最終更新日時、-anewerは最終アクセス日時、-cnewerは最終変更日時を比べる。
find -newer file3.txt -printf '%TF %TT %p\n'
(out)2025-02-21 00:04:00.0000000000 ./file1.txt
(out)2025-02-21 00:03:00.0000000000 ./file2.txt
-newerXY
-newerXY 参照先
のように書き、ファイルのタイムスタンプXと参照先のタイムスタンプYを比べて新しければTrueと見なす。XYには以下のいずれかが入る。
a | 最終アクセス日時(atime) |
B | 生成日時(Birth Time) |
c | 最終変更日時(ctime) |
m | 最終更新日時(mtime) |
t | 参照先をパスではなく時刻を表す文字列と見なす。 -newermtのように、tは必ずYの位置になる。 時刻を表す文字列の例: "2025-02-22 02:39" "Feb 1" "Feb 22, 2025 02:38" |
たとえば-neweram filename
であれば、ファイルの最終アクセス日時がfilenameの最終更新日時よりも新しければ真となる。なお-newerは-newermm、-cnewerは-newercm、-anewerは-neweramと等しい。
find -neweraa file2.txt # file2.txtの最終アクセス日時より、最終アクセス日時が新しいファイルを探す
(out)./file1.txt
(out)./file3.txt
find -newerma file2.txt # file2.txtの最終アクセス日時より、最終更新日時が新しいファイルを探す
(out)./file3.txt
-used
対象の最終更新日時を基準として、最終アクセス日時がn日経過後かを調べる。長期アクセスが無いファイルを探すのに役立つ。
サイズのテスト
-size
サイズを条件に探す。デフォルトではブロック単位である。
- 単位として
b
(ブロック)c
(バイト)k
(キビバイト)M
(メビバイト)G
(ギビバイト)が利用できる。 - +は超過、-は未満として扱われる。
- 単位に満たない端数は切り上げられる。
-size 1k
はサイズが0キビバイト超1キビバイト以下を意味し、1バイトから1024バイトが一致する。 -size -Nunit
は切り上げられた結果がNユニット未満かどうかで判定される。+も同様である。
ファイルサイズ | -0k | 0k | +0k | -1k | 1k | +1k | -2k | 2k | +2k |
---|---|---|---|---|---|---|---|---|---|
0バイト | ○ | ○ | ○ | ||||||
1バイト | ○ | ○ | ○ | ||||||
… | ○ | ○ | ○ | ||||||
1023バイト | ○ | ○ | ○ | ||||||
1024バイト | ○ | ○ | ○ | ||||||
1025バイト | ○ | ○ | ○ | ||||||
… | ○ | ○ | ○ | ||||||
2047バイト | ○ | ○ | ○ | ||||||
2048バイト | ○ | ○ | ○ | ||||||
2049バイト | ○ | ○ | ○ |
ll -Sr
(out)-rw-r--r-- 1 user user 0 Feb 22 15:06 0b.txt
(out)-rw-r--r-- 1 user user 1 Feb 22 15:10 1b.txt
(out)-rw-r--r-- 1 user user 1023 Feb 22 15:02 1kb-1.txt
(out)-rw-r--r-- 1 user user 1024 Feb 22 15:02 1kb.txt
(out)-rw-r--r-- 1 user user 1025 Feb 22 15:02 1kb+1.txt
(out)-rw-r--r-- 1 user user 2047 Feb 22 15:04 2kb-1.txt
(out)-rw-r--r-- 1 user user 2048 Feb 22 15:04 2kb.txt
(out)-rw-r--r-- 1 user user 2049 Feb 22 15:04 2kb+1.txt
find -size 2k # これは2キビバイト → 1024バイト超2048バイト以下
(out)./1kb+1.txt
(out)./2kb-1.txt
(out)./2kb.txt
find -size -2k # これは2キビバイト未満 → 1キビバイト以下 → 1024バイト以下
(out)./0b.txt
(out)./1b.txt
(out)./1kb-1.txt
(out)./1kb.txt
ブロックサイズ
デフォルトのブロックの単位は通常512バイトだが環境により異なりうる。ただし単位bは常に512バイトである。
タイプのテスト
-type
-type X
でアイテムのタイプを指定する。
オプションの値 | 説明 |
---|---|
b | ブロックデバイスファイル |
c | キャラクターデバイスファイル |
d | ディレクトリ |
f | 通常のファイル |
l | シンボリックリンク |
p | 名前付きパイプ(FIFO) |
s | ソケットファイル |
D | ドアファイル(Solaris専用) |
xtype
シンボリックリンクの時に一部挙動が異なる-xtypeもある。たとえば、-P -xtype X
(Xはlを除く上記タイプ指定のいずれか)とすると、シンボリックファイルが指すファイルの種類がXかどうか検査する。
所有者・グループのテスト
-user/-nouser/-group/-nogroup
所有者またはグループの名前かIDが一致する(またはしない)。数字でIDを指定する場合でも+/-はサポートされない。
-uid/-gid
所有者IDまたはグループIDが一致する。+/-がサポートされる。
パーミッションのテスト
-readable/-writable/-executable
findを実行したユーザが読み込み/書き込み/実行権限を持つか検査する。
-perm
パーミッションを検査する。
-perm 664
はパーミッションが664であるときに一致する。-perm -664
はパーミッションが664より許可されているときに一致する。例えば674、777などは一致する。-perm /222
は誰かが読み込み権限を持つときに一致する。
検索範囲
findコマンドは検索開始場所からディレクトリツリーをたどってファイルを探す。検索開始場所が指定されなかった場合は.(カレントフォルダ)とみなされる。
階層の深さ
-mindepth/-maxdepth
たどる階層の深さを指定する。0は検索開始場所であり、1が検索開始場所の中にあるファイルやディレクトリになる。
tree
(out). # 深さ0
(out)└── d1 # 深さ1
(out) └── d2 # 深さ2
(out) └── d3 # 深さ3
(out) └── d4 # 深さ4
(out) └── d5 # 深さ5
(out) └── d6 # 深さ6
(out)
(out)7 directories, 0 files
find -mindepth 3 -maxdepth 5
(out)./d1/d2/d3
(out)./d1/d2/d3/d4
(out)./d1/d2/d3/d4/d5
そのため、検索開始場所の直下にあるファイルやディレクトリだけを探したい場合には-mindepth 1 -maxdepth 1
とすると良い。
指定サブフォルダの除外
アクションで紹介したpruneは検索している対象がディレクトリである場合、そのディレクトリの中は探索範囲から除外し、式の結果は真となるものであった。以下のように他の式と組み合わせると、特定のディレクトリを除外できる。
find -path 除外するパス -prune -o その他のパスで実行したいアクション
実際に除外して探索する例を示す。
tree
(out).
(out)└── d1
(out) ├── 1-2
(out) └── d2
(out) ├── 2-1
(out) ├── 2-2
(out) └── d3
(out) ├── 3-1
(out) ├── 3-2
(out) └── d4
(out) ├── 4-1
(out) └── 4-2
find -path ./d1/d2/d3 -a -prune -o -print
(out).
(out)./d1
(out)./d1/1-2
(out)./d1/d2
(out)./d1/d2/2-1
(out)./d1/d2/2-2
-a (AND式)はわかりやすくするために付けており、無くても同じ結果になる。ディレクトリ./d1/d2が検索対象の項目に選ばれたとき、-path ./d1/d2/d3 -a -prune -o -print
は以下のように評価される。
-path ./d1/d2/d3
はfalseである。評価式は-false -a -prune -o -print
となる。- AND条件で左辺がfalseであるため右辺は
-prune
は評価されない。-false -o -print
という途中結果となる。 - OR条件で左辺がfalseであるため、右辺が評価される。右辺は
-print
であるため./d1/d2は出力される。
ディレクトリ./d1/d2/d3が検索対象の項目に選ばれたとき、-path ./d1/d2/d3 -a -prune -o -print
は以下のように評価される。
-path ./d1/d2/d3
はtrueである。評価式は-true -a -prune -o -print
となる。- AND条件の左辺がtrueであるため右辺
-prune
も評価される。./d1/d2/d3はディレクトリであるため、検索対象から外れた上でTrueとなる。-true -or -print
という途中結果となる。 - OR条件で左辺がtrueであるため、右辺は評価されない。./d1/d2/d3は出力されない。
なお、他の条件があるなら以下のようにすれば良い。
find -path 除外するパス -prune -o \( 他の条件 実行したいアクション \)
位置オプションとグローバルオプション
式の中にはfindコマンド自体や他の式の挙動を変更するものがある。これらは後ろに続く式にだけ影響を与える位置オプションと、全体に影響するグローバルオプションがある。見やすさの観点から以下のように書くと良い。
find [検索開始場所] グローバルオプション 式(位置オプションを含む)...
主なオプションを示す。
オプション名 | 説明 | 種類 |
---|---|---|
-daystart | 24時間経過=1日経過ではなく、午前0時をまたぐ=1日経過と考える。 | 位置オプション |
-regextype | 使用する正規表現のタイプを指定する。 | 位置オプション |
-depth | ディレクトリの内容を調べた後でディレクトリ自体を調べる。 | グローバルオプション |
-maxdepth | 検索の深さの最大値を指定する。 | グローバルオプション |
-mindepth | 検索の深さの最小値を指定する。 | グローバルオプション |
-mount | 他のファイルシステムを跨がないようにする。 | グローバルオプション |
位置オプションの場所により結果が変わる例を示す。-regextypeは-regexが使う正規表現の種類を切り替えるものだが、後に続く-regexだけに影響する。1つめはデフォルトの正規表現により「7
か8
をパスに含むもの」と解釈されるが、2つめは拡張正規表現により「(7|8)
という文字列をパスに含むもの」という解釈に変わる。
find -regex '.*\(7\|8\).*' -regextype posix-extended
(out)./file7.txt
(out)./file8.txt
find -regextype posix-extended -regex '.*\(7\|8\).*'
(out)