連載
» 2018年09月13日 05時00分 公開

Linux基本コマンドTips(240):【 find 】コマンド(応用編その4)――パーミッションを指定して探す

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルをさまざまな条件で検索する「find」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はファイルをさまざまな条件で検索する「find」コマンドです。

findコマンドとは?

 「find」は、場所(検索パス)を指定してファイルを検索するコマンドです。ファイル名だけではなく、ファイルの種類や更新日時など、細かい条件を指定して検索することができます。さらに、見つけたファイルに対して「アクション(コマンド)」を実行させることも可能です。



findコマンドの書式

find [オプション] [検索パス] [検索式]

※[ ]は省略可能な引数を示しています





findの主なオプション

短いオプション 意味
-P シンボリックリンクをたどらない(デフォルト)
-L 全てのシンボリックリンクをたどる
-H コマンドラインで指定したシンボリックリンクをたどる
-D オプション 診断用の情報(デバッグ情報)を出力する。オプションには次の文字列が入る
 help:デバッグ用オプションの説明を表示
 tree:検索式を構造化した情報
 stat:statやlstatを使ってファイルを調べたときのメッセージ
 opt:検索式を最適化する際の情報
 rates:各処理の成功した回数と失敗した回数を表示
-Oレベル 最適化レベル。「-O1」はファイル名による判別を先に行う(デフォルト)。「-O2」「-O3」では別の判定を先に行うなどで処理を高速化する

findコマンドの主な検索式

 findコマンドの主な検索式は次の通りです。

  • ファイル名やファイルの種類
検索式 意味
-name パターン ファイル名がパターンと一致するファイル(「-name "*.txt"」のような指定が可能)
-iname パターン -nameと同じだが、大文字と小文字を区別しない
-lname パターン シンボリックリンクのリンク先ファイル名がパターンと一致するファイル
-ilname パターン -lnameと同じだが、大文字と小文字を区別しない
-path パターン パスがパターンと一致するファイル
-ipath パターン -pathと同じだが、大文字と小文字を区別しない
-regex パターン ファイル名がパターンと一致するファイル、パターンに正規表現が指定可能
-iregex パターン -regexと同じだが、大文字と小文字を区別しない
-type タイプ ファイルタイプ(通常ファイルだけを対象としたい場合は「f」、ディレクトリは「d」、シンボリックリンクは「l」)
-xtype タイプ -typeと同じだが、「-H」や「-P」が指定されている場合はリンク先のファイルタイプで判定する
-executable 実行可能なファイルまたは検索可能なディレクトリ(-permと違いACLなども考慮する)
-readable 読み込み可能なファイルにマッチする(-permと違いACLなども考慮する)
-writable 書き込み可能なファイルにマッチする(-permと違いACLなども考慮する)
-fstype タイプ ファイルが置かれているファイルシステムのタイプ(ufs、nfs、tmpなど)

  • タイムスタンプ関係
検索式 意味
-mmin 分数 指定した分数より前に更新されたファイル(「-mmin 3」で3分前、「-mmin +3」で3分以上前、「-mmin -3」で3分以内に更新、以下同)
-mtime 日数 指定した日数より前に更新されたファイル
-newer ファイル 指定したファイルの更新時刻以降に更新されたファイル
-amin 分数 指定した分数より前にアクセスされたファイル
-atime 日数 指定した日数より前にアクセスされたファイル
-anewer ファイル 指定したファイルのアクセス時刻以降にアクセスされたファイル
-cmin 分数 指定した分数より前にステータスが変更されたファイル
-ctime 日数 指定した日数より前にステータスが変更されたファイル
-cnewer ファイル 指定したファイルのステータス変更時刻にステータスが変更されたファイル
-daystart -amin、-atime、-cmin、-ctime、-mmin、-mtimeで“今日”の始まりを現在から24時間前ではなく、コマンド実行当日の0時にする

  • その他の属性関係
検索式 意味
-uid 数値 所有者のユーザーIDが指定した数値のファイル
-user 名前 所有者の名前が指定した名前のファイル
-gid 数値 所有グループID番号が指定した数値のファイル
-group 名前 所有グループ名が指定した名前のファイル
-nouser ユーザーIDに対応するユーザーがいないファイル
-nogroup ユーザーグループID番号に対応するグループがないファイル
-perm モード パーミッションがモードと一致したファイル(「-モード」で指定したモードを全て許可しているファイル、「/モード」で指定したモードのいずれかを許可しているファイル)
-empty 空のファイルまたは空のディレクトリ
-size サイズ ファイルサイズが指定したサイズに一致したファイル(「-size +3k」でサイズが3KBより大きなファイル)
-links リンク数 リンク数が指定したリンク数に一致したファイル
-inum 番号 inode番号が番号に一致したファイル
-samefile ファイル 指定したファイルと同じinode番号を参照しているファイル(「-L」オプションが有効な場合はシンボリックリンクも含まれる)

  • アクション他
検索式 意味
-print 見つけたファイルをフルパスで出力する(デフォルト)
-ls 見つけたファイルを「ls -dgils」形式で出力する
-print0 見つけたファイルのフルパスをNULL区切りで出力
-printf フォーマット 見つけたファイルをフォーマットに従った書式で出力する
-fprint ファイル -printと同じ書式で指定したファイルに出力する
-fls ファイル -lsと同じ書式で指定したファイルに出力する
-delete 見つけたファイルを消去する
-exec コマンド ; 見つけたファイルを引数にコマンドを実行する(オプションも指定可能。以下同)
-execdir コマンド ; 見つけたファイルのあるディレクトリでコマンドを実行する
-ok コマンド ; 見つけたファイルを引数に、確認メッセージを表示しながらコマンドを実行する(オプションも指定可能、以下同)
-okdir コマンド ; 見つけたファイルのあるディレクトリで、確認メッセージを表示しながらコマンドを実行する
-an、-a 条件をANDで結ぶ
-or、-o 条件をORで結ぶ
-not 条件を否定する
-true 常に真
-false 常に偽
-quit 直ちに終了する
-depth 深さ 検索するディレクトリの深さを指定
-maxdepth 深さ 検索するディレクトリの最大の深さ(「-maxdepth 0」はコマンドラインで指定したディレクトリのみ検索)
-mindepth 深さ 検索するディレクトリの最小の深さ(「-mindepth 1」はコマンドラインで指定したディレクトリより深いディレクトリを検索)
-prune ディレクトリに降りない
-mount 他のファイルシステムにあるディレクトリを探索しない
-noleaf 「ディレクトリのハードリンク数から2を引いたものが、そのディレクトリに含まれるサブディレクトリの数である」という最適化を行わない


パーミッションを指定して探す

 パーミッションを探すには「find 検索パス -perm パーミッション」でモードを指定します。

 例えば「-perm 664」または「-perm 0664」の場合、パーミッションが「644」つまり「rw-rw-r--」に一致するファイルを表示します(画面1、※1)。

 「-L」オプションを付けると、シンボリックリンクのリンク先のパーミッションも判定します。

※1 パーミションとは、各ファイルやディレクトリに与えられた権限をいう。権限の種類は3つあり、読み出し可能(4またはr)と書き込み可能(2またはw)、実行可能(1またはx)となっている。数字が3桁になっている理由は、ファイルの所有者(u)、所有グループ(g)、その他(o)の権限をそれぞれ表しているためだ。複数の権限を兼ねている場合は数字を足すか、文字を「+」でつないで表す。詳しくは、第14回を参照。664はCentOS環境におけるデフォルトのumask(0002)で作成したファイルのパーミッション。Ubuntu環境の場合、デフォルトのumask(0022)で作成すると644になる。



コマンド実行例

find 検索パス -perm パーミッション

(指定したパーミッションと一致するファイルを探す)

find -L 検索パス -perm パーミッション

(指定したパーミッションと一致するファイルを探し、一致したものがシンボリックリンクの場合はリンク先のパーミッションで判定する)


画面1 画面1 パーミッションを指定して検索したところ


指定したパーミッションを含むファイルを探す

 「find 検索パス -perm -モード」で、指定したパーミッションが「全て」含まれているファイルを探します。全てではなく、「どれか1つ以上」が含まれているファイルを探す場合には、「-perm /モード」を使います。

 例えば、「-perm -111」または「-perm -a+x」を指定したときは、所有者とグループ、その他の全てに実行許可(1、x)が設定されているファイルを探します(画面2、※2)。

 「-perm /111」または「-perm /a+x」では、所有者、グループ、その他のどれか1つ以上に実行許可が設定されているファイルを探します。

※2 「a」は全てのユーザーを表す。「/」記号の他に「+」記号も使用できるが現在は非推奨(Ubuntu 18LTSに収録されているバージョン4.7.0では既にサポートされていない)。



コマンド実行例

find 検索パス -perm -モード

(指定したモードが全て含まれているファイルを探す)

find 検索パス -perm /モード

(指定したモードのどれか1つ以上が含まれているファイルを探す)


画面2 画面2 パーミションの含み方を指定して検索したところ


特殊なパーミッションのファイルを探す

 実行時の権限を指定するSUID(Set User ID)とSGID(Set Goup ID)というパーミッションがLinuxには用意されています(“応用力”をつけるためのLinux再入門第12回を参照)。

 SUIDが設定されているファイルを探したい場合は「u」を付けて「-perm -u+s」と指定するか、パーミッションに「4000」を足して「-perm -4000」のように指定します(画面3)。

 同様に、SGIDが設定されているファイルを探したい場合は「g」を付けて「-perm -g+s」とするか、「2000」を足して「-perm -2000」のように指定します。

コマンド実行例

find 検索パス -perm -u+s

(SUIDが設定されているファイルを探す)

find 検索パス -perm -g+s

(SGIDが設定されているファイルを探す)

find /usr/bin -perm -u+s -o -perm -g+s

(SUIDまたはSGIDが設定されているファイルを/usr/bin以下から探す、-oは「または」という意味)(画面3


画面3 画面3 SUIDやSGIDが付いたファイルを検索したところ


実行可能なファイルを探す

 「-perm」を使った検索指定では、「拡張ACL」を考慮しません(※3)。拡張ACLも考慮した上で、実行許可が与えられているファイルを検索したい場合は「-executable」を使います(画面4)。

※3 拡張アクセス制御リスト(拡張ACL)とは、chmodコマンドなどで設定できる一般的なファイルアクセス制御(基本ACL)を超えた設定をいう。拡張ACLでは特定のユーザーやグループに対してファイルごとにアクセス制御を設定できる。詳しくは第237回を参照。



 基本ACL(-permの判定で使用している通常のパーミッション)も考慮するため、「実行許可があるファイル」を探したい場合は「-perm」でモードを指定するよりも簡単でしょう。

 同様に、読み出し可能なファイルは「-readable」、書き込み可能なファイルは「-writable」を使って探すことができます。

 ディレクトリを含まず、ファイルだけで判定したい場合は「-type -f」を指定します。シンボリックリンクのリンク先も考慮したい場合は「-L」オプションを使うか、「-xtype f」を指定します。

 「-L」はシンボリックリンクをたどるというオプションです。「-xtype」は「シンボリックリンクの場合はリンク先で判定する」という指定です。

コマンド実行例

find 検索パス -executable

(実行許可があるファイルを探す)

find 検索パス -executable -type f

(ファイルのみを対象として、実行許可があるファイルを探する)

find 検索パス -executable -xtype f

(ファイルのみを対象として、シンボリックリンクの場合はリンク先がファイルであるものを含め実行許可があるファイルを探する)

find 検索パス -readable

(読み出し許可があるファイルを探す)

find 検索パス -writable

(書き込み許可があるファイルを探す)


画面4 画面4 拡張ACLを考慮してファイルを検索したところ

 なお、「-executable」の判定は「findコマンドを実行しているユーザーに実行可能かどうか」で決まります。「-readable」「-writable」も同様です。

 画面5では、「setfacl」コマンド(第234回)でユーザー「penguin」に実行許可を追加しています。

画面5 画面5 拡張ACLを設定後、実行可能ファイルを検索したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。