プロジェクト

全般

プロフィール

findコマンド

概要

指定したパスを起点に、ディレクトリを再帰的に検索して条件にマッチした要素(ファイル、ディレクトリ)を抽出し、printまたは処理を実行します。
条件には、ファイルの種類、名前、タイムスタンプなどを指定できます。

使い方

検索の起点の指定

最初のコマンドラインオプションで、検索の出発点となるディレクトリを指定します。

たどり方の制御

  • シンボリックリンクのパスは、デフォルトでは辿らないので、辿りたい場合は -L オプションを指定する

ファイルのタイムスタンプで絞り込み

atime/ctime/mtime, amin/cmin/mmin

例)-mtime -30 は、ファイルの最終更新時刻が30日以前を対象とする

先頭のa,c,mは、タイムスタンプの種類を指定します。後ろのtime, minは、指定する値がtimeなら日、minなら分の単位となります。

種類 内容
a 最終アクセスなのでリード操作でもタイムスタンプが更新される
c ファイルの更新のほか属性変更のあった最終時刻なので、ライト操作、パーミッション変更操作でタイムスタンプが更新される
m ファイルの更新があった最終時刻なので、ライト操作でタイムスタンプが更新される
単位指定 単位
time
min

値の指定には、+30, -30のように符号を付けることができ、次の意味となります。

符号 意味
なし ちょうど指定した日または分に更新されたものを選択
- 指定した日または分よりも新しいものを範囲を選択
+ 指定した日または分よりも過去の範囲を選択

time(日)を指定する場合、-atime +1とすると、findコマンドを実行した現在時刻とファイルのタイムスタンプの時間差を24で割って、余りは捨てられます。47時間前の更新は1.95833... で切り捨てて1日前と扱われ、+1は1日よりも過去のものを指定するので対象外となります。

newerat/newerct/newermt

指定した日付・時刻より新しいファイルを対象とする指定です。
newerの次のa, c, mは、前述同様ファイルタイムスタンプの種類です。

find . -type f -newermt "20240428 1800"
"1800"の部分は、"18:00"としてもOK

ファイルの種類で絞り込み

指定 内容 備考
-type f ファイルを対象 シンボリックリンクファイルは対象外
-type d ディレクトリを対象

指定したディレクトリ以下を検索から除外

prune

<除外条件> -prune -o <検索条件> <アクション> と、最初に除外条件を記述し、-prune -o に続けて検索条件 とアクションを指定します。

除外したいディレクトリを-nameオプションで指定し、-pruneを指定します。続いて、除外ディレクトリ以外での検索条件を指定します。

find . -name "old" -prune -o -name "*.py" -print

oldディレクトリがあるとそれ以下のディレクトリの検索を打ち切ります。
それ以外のディレクトリの場合、、-name 条件で合致したものをアクション -print で実行します。

-print(または他のアクション)を指定しないと、打ち切りしたディレクトリも表示されます。

-oの後に-nameを複数orで並べる

find . -name "old" -prune -o \( -name "*py" -or -name "*pyc" \) -print

カッコをつけないと、後者の条件(-name "*pyc")に合致したものだけprint

使用例

findで指定した検索場所(パス)から一定期間アクセスのないファイルを検出する際、検索場所を除外

まず、検索場所を指定し、それ以下のディレクトリで30日よりも前に修正があったものを抽出しようとしたfindです。

$ find ./work -type d -mtime +30
work
work/alfa
work/bravo
work/charly

起点となるディレクトリ(~/work)も対象に含まれます(もしファイルの更新が指定期間なかったら)。
その場合、意図しない動作が発生します。

次のように、-mindepth 1を指定することで、起点となるディレクトリを除外することができます。

$ find ./work -mindepth 1 -type d -mtime +30
work/alfa
work/bravo
work/charly

注意点

シンボリックリンク

  • findで指定した検索場所(パス)がシンボリックリンクの時、デフォルトではシンボリックリンク先を辿らないので意図した検索が働きません。-Hオプションでパスがシンボリックリンクの時にリンク先を辿るよう指定します。なお、リンク先にさらにシンボリックリンクがある場合、その先を辿りたい場合は-Hオプションではなく-Lオプションを指定します。
    • -Hオプションではなく、パスの末尾に/を付ける方法もあります。


21日前に更新