【 find 】コマンド(応用編その3)――リンクを探すLinux基本コマンドTips(239)

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

» 2018年09月07日 05時00分 公開
[@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を引いたものが、そのディレクトリに含まれるサブディレクトリの数である」という最適化を行わない


シンボリックリンクを探す

 シンボリックリンクを探すには「-type」で「l」(linkのエル)を指定します。シンボリックリンク自体については、lnコマンド(第16回)を参照してください。

 該当するファイルの個数が多いため、画面1ではheadコマンドで見つかったファイルの先頭10個のみを表示しています(※1)。

※1 パイプでheadコマンドに接続した場合、先頭の10行を出力してheadコマンドが終了した時点でfindコマンドの処理も終了する。つまり、「find 〜 | head -3」のようにheadコマンドの引数で行数を指定すると、指定した数だけ見つけた時点で直ちにfindコマンドの実行を終了できる。



コマンド実行例

find 検索パス -type l

(指定した検索パスにあるシンボリックリンクを探す)

find /usr/bin -type l

(/usr/binにあるシンボリックリンクを探す)(画面1


画面1 画面1 指定したパス以下の全てのシンボリックリンクを検索したところ


リンク先のファイル名を指定して検索する

 「find 検索パス -lname ファイル名」でリンク先のファイル名を指定して検索できます。例えば、「-lname bash」で「bash」へリンクされているファイルを表示します。

 大文字と小文字の区別をしたくない場合は「-ilname」を使用します(画面2)。

コマンド実行例

find 検索パス -lname 名前

(指定した名前へリンクしているファイルを探す)

find 検索パス -ilname 名前

(大小文字を区別せず、指定した名前へリンクしているファイルを探す)

find /usr/bin -ilname xorg

(xORgやXorgなどにリンクしているファイルを探す)


画面2 画面2 大文字と小文字を区別せず「xorg」にリンクしているファイルを探したところ


実体が同じファイルを探す

 「-samefile」で、指定したファイルと実体が同じであるファイルを検索できます。ハードリンクを検索するために使います(画面3)。

 ハードリンクとはあるファイルに別の名前を付けたものです。ただし、シンボリックリンクとは異なり、ハードリンクではタイムスンプや各種権限、ファイルサイズなどが全て等しくなります。ハードリンク自体については、lnコマンド(第16回)を参照してください。

 シンボリックリンク先をたどる「-L」オプション付きで実行している場合、シンボリックリンクも対象になります。

コマンド実行例

find 検索パス -samefile ファイル

(指定したファイルと実体が同じファイルを探す)

find -L 検索パス -samefile ファイル

(シンボリックリンクも含め、指定したファイルと実体が同じファイルを探す)


画面3 画面3 実体が同じファイルを探したところ

 環境によっては、ハードリンクがあまり使われていないかもしれません。「-samefile」の動作を試してみたい場合は、lnコマンドで作成するといいでしょう。

$ touch testfile	「testfile」を作成
$ ln testfile linkfile1	testfileのハードリンク「linkfile1」を作成
$ ln -s testfile linkfile2	testfileのシンボリックリンク「linkfile2」を作成
$ find . -samefile testfile	testfileと実体が同じファイルを探す
./testfile
./linkfile1
$ find -L . -samefile testfile	シンボリックリンクも含め、testfileと実体が同じファイルを探す
./testfile
./linkfile1
./linkfile2
$
ハードリンクを使ってfindコマンドの機能を試したところ


inode番号で探す

 先ほど紹介した実体が同じファイル(ハードリンク)では、inode番号が同じになっています。「-inum」を使うと、ファイル名ではなく、直接inode番号を指定して検索できます。

 inode番号はlsコマンドの「-i」オプション(--inodeオプション)や、statコマンドで確認できます。

 statコマンドの場合、「-c」オプション(--formatオプション)で書式「%i」を指定することで、inodeだけを出力できます。そこで、「-inum `stat -c %i ファイル名`」のようバッククオートを使うことでstatコマンドの実行結果を「-inum」オプションに引数にすることで、指定したファイルとinodeが共通のファイルを検索できます(画面4)。

コマンド実行例

find 検索パス -inum inode番号

(指定したinode番号のファイルを探す)


画面4 画面4 inode番号を指定してファイルを探したところ


ハードリンクの数で探す

 「-links」で、ハードリンクの数を指定してファイルを検索できます。リンクが2つならば「-links 2」、5つ以上であれば「-links +5」のように指定します(画面5)。

 実行結果にディレクトリを含みたくない場合は「-type f」を付けます(※2)。

※2 ディレクトリでは、「.」や、サブディレクトリから見た「..」などが存在するため、ハードリンクの個数は常に複数となる(Linux再入門連載第9回)。



コマンド実行例

find 検索パス -links 2

(ハードリンクが2個あるファイルを探す)

find 検索パス -links 2 -type f

(ディレクトリを除外し、ハードリンクが2個あるファイルを探す)

find 検索パス -links +2 -type 2

(ディレクトリを除外し、ハードリンクが2個以上あるファイルを探す)


画面5 画面5 ハードリンクが2つあるファイルを検索したところ

 画面6は、CentOS環境で、/usr/bin以下にあるリンク数が3以上のファイルを表示したところです。検索パスは/usr/bin、検索条件はハードリンク数が3以上(-links +3)、ファイル(-type f)です。

 結果の出力に際しては「-ls」で出力フォーマットを詳細表示(ls -dgils相当)にしています。

コマンド実行例

find /usr/bin -links +3 -type f -ls

(出力形式を指定してハードリンクが3個以上のファイルだけを検索する)(画面6


画面6 画面6 ハードリンクの数が3個以上のファイルを探したところ


筆者紹介

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

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のメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。