このページの内容

2.9 ファイルのモードビット

ファイルのモードビットの構成と指定方法については、ファイルの権限を参照してください。

ユーザーがファイルに対して何を行えるかを判断するテストは、「-readable」「-writable」「-executable」「-perm」の4つです。最初の3つは、現在のユーザーが該当する操作を行えるかどうかをOSに問い合わせますが、「-perm」はファイルのモードだけを調べます。ファイルにはアクセス制御リストがある場合や、読み取り専用のファイルシステム上にある場合などがあるため、モードから受ける印象と、実際にユーザーが行える操作とが食い違うことがあります。ただし、この4つのうちPOSIX標準で定められているのは「-perm」だけです。

「-readable」「-writable」「-executable」は、accessシステムコールを通して実装されています。これはOS自身が実装するものです。対象ファイルがNFSファイルシステム上にある場合、NFSクライアントでは考慮できない理由によって、リモートシステムが読み書きを許可または禁止することがあります。これには、一般的なユーザーIDの対応付けのほか、リモートのスーパーユーザーをNFSサーバー上のローカルユーザー「nobody」とみなす、より限定的な対応付けも含まれます。

競合状態が発生する可能性があるため、この節のどのテストも、ユーザーが対象ファイルやほかのファイルに対して操作する権限を持つことの確認に使うべきではありません。テストを行った時点と、その結果に基づいて操作する時点の間に、状況が変わる可能性があるということです。

テスト: -readable

呼び出したユーザーがファイルを読み取れる場合に真になります。

テスト: -writable

呼び出したユーザーがファイルに書き込める場合に真になります。これは原理上の確認であり、ファイルシステムが満杯である場合など、別の要因で実際の書き込みが妨げられる可能性があります。

テスト: -executable

呼び出したユーザーがファイルを実行できる、またはディレクトリを検索できる場合に真になります。

テスト: -perm pmode

ファイルのモードビットがpmodeに一致すると真になります。これは記号形式または数値形式のmodeで、「-」または「/」を前置することもできます。ファイルの権限を参照してください。

pmodeは、すべてのファイルモードビットがクリアされた状態から始まることに注意してください。つまり、プロセスのファイル作成マスクであるumaskとは関係ありません。

「-」でも「/」でも始まらないpmodeは、modeがファイルのモードビットと完全に一致する場合に一致します。

「-」で始まるpmodeは、modeで設定されたモードビットのすべてがファイルにも設定されている場合に一致します。modeで設定されていないビットは無視します。

「/」で始まるpmodeは、modeで設定されたモードビットのいずれかがファイルにも設定されている場合に一致します。modeで設定されていないビットは無視します。これはGNUの拡張です。

記号形式のモード文字列で「/」や「-」の形式を使わない場合、かなり複雑な文字列を指定する必要があるかもしれません。たとえば、「-perm g=w」は、モードが0020のファイルだけに一致します。つまり、グループの書き込み権限だけが設定されているものです。使いたいのは「/」や「-」の形式であることが多く、たとえば「-perm -g=w」は、グループの書き込み権限を持つ任意のファイルに一致します。

GNU findは以前、「-perm +mode」に対応していました。findutils 4.2.21(2005年)で非推奨となり、「-perm /mode」に置き換えられました。「-perm +mode」への対応は4.5.12(2013年)で完全に削除されました。この廃止されたGNU拡張との混同を避けるため、modeを「+」と、その直後の8進数の数字で始めてはいけません。

‘-perm 664’

所有者とグループには読み書きの権限があり、それ以外のユーザーには読み取りだけが許可されたファイルに一致します。条件を満たしていても、ほかのモードビットが設定されているファイルには一致しません。たとえば、誰かが実行や検索できるファイルは一致しません。

‘-perm -664’

所有者とグループには読み書きの権限があり、それ以外のユーザーには読み取りだけが許可されたファイルに一致します。実行ビットなど、追加のモードビットの有無は問いません。たとえば、モード0777のファイルにも一致します。

‘-perm /222’

所有者、グループ、それ以外のユーザーのうち、誰かが書き込めるファイルに一致します。

‘-perm /022’

グループまたはそれ以外のすべてのユーザーが書き込めるファイルに一致します。後者はしばしばotherと呼ばれます。グループとotherの両方が書き込める必要はなく、どちらか一方で構いません。

‘-perm /g+w,o+w’

上記と同じです。

‘-perm /g=w,o=w’

上記と同じです。

‘-perm -022’

グループと、それ以外のすべてのユーザーの両方が書き込めるファイルに一致します。

‘-perm -g+w,o+w’

上記と同じです。

‘-perm -444 -perm /222 ! -perm /111’

誰でも読み取れ、少なくとも1つの書き込みビットが設定されていて誰かが書き込めるものの、誰も実行や検索できないファイルに一致します。一部のシェルでは「!」をエスケープする必要があります。

‘-perm -a+r -perm /a+w ! -perm /a+x’

上記と同じです。

注意: 「-perm /000」を指定した場合や、記号形式のモード「mode」にビットが1つも設定されていない「-perm /mode」を指定した場合、テストはすべてのファイルに一致します。4.3.3(2007年)より前のGNU findでは、この状況で何にも一致しませんでした。

テスト: -context pattern

ファイルのSELinuxコンテキストがパターンpatternに一致する場合に真になります。パターンにはシェルのglob照合を使います。

この述語は、SELinuxに対応するようにコンパイルされたfindで、かつSELinuxが有効な場合にだけ利用できます。