findコマンドのオプション･評価式の一覧と移植性のまとめ

## はじめに

`find` コマンドのオプションと評価式をまとめました。各項目の意味は説明していないのでドキュメントを参照してください。

表の列は対応している OS や環境を意味しています。

|               |                |            |          |            |
| ------------- | -------------- | ---------- | -------- | ---------- |
| P: POSIX 準拠 | G: GNU (Linux) | B: BusyBox | M: macOS | F: FreeBSD |
| N: NetBSD     | O: OpenBSD     | S: Solaris | A: AIX   | /: 廃止    |

太字は（調査した範囲で）どの環境でも動くオプションです。基本的に POSIX で標準化されているものはどの環境でも動きますが、POSIX で標準化されていない `-follow`（非推奨）、`inum`、`-amin/-cmin/-mmin` もどの環境でも動きます。

補足に書いてある Issue6、Issue7、Issue8 は どの POSIX の改定で標準化されたのかを意味しています。POSIX 準拠の項目で何も書いていないものはそれ以前（おそらく最初から）標準化されていたものです。

## コマンドラインオプション

コマンドラインオプションは `find` コマンドのパスの前に書くオプションのことです。パスは GNU find では省略可能ですが、その他の実装では省略できません。

```txt
find [オプション] パス... [評価式]
```

|              | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足 |
| ------------ | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- |
| **-L**       | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| **-H**       | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -P           | -   | G   | B   | M   | F   | -   | -   | -   | -   |      |
| -D debugopts | -   | G   | -   | -   | -   | -   | -   | -   | -   |      |
| -Olevel      | -   | G   | -   | -   | -   | -   | -   | -   | -   |      |
| -d           | -   | -   | -   | M   | F   | N   | O   | -   | -   |      |
| -E           | -   | -   | -   | M   | F   | N   | -   | -   | -   |      |
| -f path      | -   | -   | -   | M   | F   | N   | O   | -   | -   |      |
| -H           | -   | -   | -   | -   | -   | -   | O   | -   | -   |      |
| -h           | -   | -   | -   | -   | -   | N   | O   | -   | -   |      |
| -s           | -   | -   | -   | M   | F   | N   | -   | -   | -   |      |
| -X           | -   | -   | -   | M   | F   | N   | O   | -   | -   |      |
| -x           | -   | -   | -   | M   | F   | N   | O   | -   | -   |      |

## 評価式

評価式 (expression) はパスの後ろに書く引数です。

```txt
find [オプション] パス... [評価式]
```

### 演算子（オペレータ）

|         | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足 |
| ------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- |
| **-a**  | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -and    | -   | G   | B   | M   | F   | N   | O   | -   | -   |      |
| **-o**  | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -or     | -   | G   | B   | M   | F   | N   | O   | -   | -   |      |
| **!**   | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| ,       | -   | G   | -   | -   | -   | -   | -   | -   | -   |      |
| **( )** | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |

### オプション（グローバルオプション）

|                        | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足     |
| ---------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -------- |
| **-depth**             | P   | G   | B   | M   | F   | N   | O   | S   | A   |          |
| -depth n               | -   | -   | -   | M   | F   | -   | -   | -   | -   |          |
| **-xdev**              | P   | G   | B   | M   | F   | N   | O   | S   | A   |          |
| **-mount**             | P   | G   | B   | M   | F   | N   | O   | S   | A   | [Issue8] |
| -maxdepth levels       | -   | G   | B   | M   | F   | N   | O   | -   | -   |          |
| -mindepth levels       | -   | G   | B   | M   | F   | N   | O   | -   | -   |          |
| -noleaf                | -   | G   | -   | M   | F   | -   | -   | -   | -   |          |
| -ignore_readdir_race   | -   | G   | -   | M   | F   | -   | -   | -   | -   |          |
| -noignore_readdir_race | -   | G   | -   | M   | F   | -   | -   | -   | -   |          |

補足 `-maxdepth` は Solaris と AIX で使用できませんが、次の方法で代用可能です（[参考](https://www.in-ulm.de/~mascheck/various/find/)）。

```console:カレントディレクトリのみから検索
$ find . -maxdepth 1 ! -name . その他の式 # GNU・BSD 系 OS 版
$ find . ! -name . -prune その他の式      # 全対応
```

```console:指定したディレクトリのみから検索
$ find /tmp -maxdepth 1 ! -path /tmp その他の式 # GNU・BSD 系 OS 版
$ find /tmp ! -path /tmp -prune その他の式      # 全対応
```

### オプション（ポジショナルオプション）

|                 | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足                 |
| --------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -------------------- |
| -daystart       | -   | G   | -   | -   | -   | -   | -   | -   | -   |                      |
| **-follow**     | -   | G   | B   | M   | F   | N   | O   | S   | A   | 非推奨 -L を使用する |
| -regextype type | -   | G   | -   | -   | -   | -   | -   | -   | A   |                      |
| -warn, -nowarn  | -   | G   | -   | -   | -   | -   | -   | -   | -   |                      |

### 判別式（ファイル名・パス名）

|                     | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足                |
| ------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ------------------- |
| **-name** pattern   | P   | G   | B   | M   | F   | N   | O   | S   | A   |                     |
| **-iname** pattern  | P   | G   | B   | M   | F   | N   | O   | S   | A   | [Issue8]            |
| **-path** pattern   | P   | G   | B   | M   | F   | N   | O   | S   | A   | [Issue7]            |
| -ipath pattern      | -   | G   | B   | M   | F   | -   | -   | -   | -   |                     |
| -regex pattern      | -   | G   | B   | M   | F   | N   | -   | -   | A   |                     |
| -iregex pattern     | -   | G   | -   | M   | F   | N   | -   | -   | A   |                     |
| -lname pattern      | -   | G   | -   | M   | F   | -   | -   | -   | -   |                     |
| -ilname pattern     | -   | G   | -   | M   | F   | -   | -   | -   | -   |                     |
| -wholename pattern  | -   | G   | -   | M   | F   | -   | -   | -   | -   | -path の使用が推奨  |
| -iwholename pattern | -   | G   | -   | M   | F   | -   | -   | -   | -   | -ipath の使用が推奨 |

### 判別式（ファイル属性）

|                       | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足         |
| --------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ------------ |
| **-type c**           | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| **-perm mode**        | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| **-perm -mode**       | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| -perm +mode           | -   | /   | B   | M   | F   | -   | -   | -   | -   | /mode と同等 |
| -perm /mode           | -   | G   | B   | -   | -   | -   | -   | -   | -   |              |
| -executable           | -   | G   | B   | -   | -   | -   | -   | -   | -   |              |
| -readable             | -   | G   | -   | -   | -   | -   | -   | -   | -   |              |
| -writable             | -   | G   | -   | -   | -   | -   | -   | -   | -   |              |
| -xtype c              | -   | G   | -   | -   | -   | -   | -   | -   | -   |              |
| -fstype type          | -   | G   | -   | M   | F   | N   | O   | S   | A   |              |
| -local                | -   | -   | -   | -   | -   | -   | -   | S   | -   |              |
| **-user uname**       | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| **-group gname**      | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| **-nouser**           | P   | G   | -   | M   | F   | N   | O   | S   | A   |              |
| **-nogroup**          | P   | G   | -   | M   | F   | N   | O   | S   | A   |              |
| -uid n                | -   | G   | -   | M   | F   | -   | -   | -   | -   |              |
| -gid n                | -   | G   | -   | M   | F   | -   | -   | -   | -   |              |
| **-size n[c]**        | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| -samefile name        | -   | G   | B   | M   | F   | -   | -   | -   | -   |              |
| **-inum n**           | -   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| -empty                | -   | G   | B   | M   | F   | N   | O   | -   | -   |              |
| **-links n**          | P   | G   | B   | M   | F   | N   | O   | S   | A   |              |
| -acl                  | -   | -   | -   | M   | F   | -   | -   | S   | -   |              |
| -context pattern      | -   | G   | -   | -   | -   | -   | -   | -   | -   |              |
| -xattr                | -   | -   | -   | M   | -   | -   | -   | S   | -   |              |
| -ea                   | -   | -   | -   | -   | -   | -   | -   | -   | A   |              |
| -flags flags,notflags | -   | -   | -   | M   | F   | N   | O   | -   | -   |              |
| -sparse               | -   | -   | -   | M   | F   | -   | -   | -   | -   |              |
| -cpio device          | -   | -   | -   | -   | -   | -   | -   | S   | A   |              |
| -ncpio device         | -   | -   | -   | -   | -   | -   | -   | S   | -   |              |

### 判別式（ファイル日時）

|                      | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足 |
| -------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- |
| **-atime n**         | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -atime n[smhdw]      | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| **-ctime n**         | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -ctime n[smhdw]      | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| **-mtime n**         | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -mtime n[smhdw]      | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| -Btime n             | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| -Btime n[smhdw]      | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| **-amin n**          | -   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| **-cmin n**          | -   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| **-mmin n**          | -   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -Bmin n              | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| -anewer reference    | -   | G   | -   | M   | F   | N   | O   | -   | -   |      |
| -cnewer reference    | -   | G   | -   | M   | F   | N   | O   | -   | -   |      |
| -Bnewer reference    | -   | -   | -   | M   | F   | -   | -   | -   | -   |      |
| **-newer reference** | P   | G   | B   | M   | F   | N   | O   | S   | A   |      |
| -newerXY reference   | -   | G   | -   | M   | F   | N   | -   | -   | -   |      |
| -asince timestamp    | -   | -   | -   | -   | -   | N   | -   | -   | -   |      |
| -csince timestamp    | -   | -   | -   | -   | -   | N   | -   | -   | -   |      |
| -since timestamp     | -   | -   | -   | -   | -   | N   | -   | -   | -   |      |
| -used n              | -   | G   | -   | -   | -   | -   | -   | -   | -   |      |

### アクション

|                        | P   | G   | B   | M   | F   | N   | O   | S   | A   | 補足          |
| ---------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ------------- |
| **-exec command {} ;** | P   | G   | B   | M   | F   | N   | O   | S   | A   |               |
| **-exec command {} +** | P   | G   | B   | M   | F   | N   | O   | S   | A   | [Issue6]      |
| -execdir command {} ;  | -   | G   | -   | M   | F   | N   | O   | -   | -   |               |
| -execdir command {} +  | -   | G   | -   | M   | F   | -   | -   | -   | -   |               |
| **-ok command {} ;**   | P   | G   | -   | M   | F   | N   | O   | S   | A   |               |
| -okdir command {} ;    | -   | G   | -   | M   | F   | -   | -   | -   | -   |               |
| **-print**             | P   | G   | B   | M   | F   | N   | O   | S   | A   |               |
| **-print0**            | P   | G   | B   | M   | F   | N   | O   | S   | -   | [Issue 8] 注1 |
| -printf format         | -   | G   | -   | -   | -   | -   | -   | -   | -   |               |
| -printx                | -   | -   | -   | -   | -   | N   | -   | -   | -   | 注2              |
| -fprint file           | -   | G   | -   | -   | -   | N   | -   | -   | -   |               |
| -fprint0 file          | -   | G   | -   | -   | -   | -   | -   | -   | -   |               |
| -fprintf file format   | -   | G   | -   | -   | -   | -   | -   | -   | -   |               |
| -ls                    | -   | G   | -   | M   | F   | -   | O   | S   | A   |               |
| -long                  | -   | -   | -   | -   | -   | -   | -   | -   | A   |               |
| -fls file              | -   | G   | -   | -   | -   | N   | -   | -   | -   |               |
| **-prune**             | P   | G   | B   | M   | F   | N   | O   | S   | A   |               |
| -delete                | -   | G   | B   | M   | F   | N   | O   | -   | -   |               |
| -quit                  | -   | G   | B   | M   | F   | -   | -   | -   | -   |               |
| -true, -false          | -   | G   | -   | M   | F   | N   | -   | -   | -   |               |
| -exit                  | -   | -   | -   | -   | -   | N   | -   | -   | -   |               |

- 注1 AIX 7.3 が非対応だが POSIX Issue 8 で標準化されており、近いうちに対応されると想定できるのでどの環境でも動くとした
- 注2 -printx は xargs 等に安全にファイル名を渡せるようにスペースやタブ、クォーテーションなどをバックスラッシュエスケープして出力する機能