findコマンド¶
- 目次
- 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
出力(print)¶
findで検索条件にヒットしたファイル・ディレクトリを出力します。
printf¶
フォーマットを指定してfindの結果を標準出力に送ります。書式に指定できるコマンド(抜粋)は
- %p ヒットしたパスのフルパス
- %P ヒットしたパスの相対パス
- %f ヒットしたパスのファイル名
- %h ヒットしたパスのディレクトリ名のフルパス
- %H ヒットしたパスのディレクトリ名の相対パス
他にもパスの属性、シンボリックリンク先、などの情報をコマンドで指定できます。
work$ find . -name "*.txt" -printf "mv %p %h/..\n" > moves.sh
ファイル名 "*.txt" を検索し、ファイルのある場所の1つ上のディレクトリに移動させるシェルコマンドを標準出力に出す。
参考)パイプでbashに出力するとファイルに落とさずにシェルコマンドを実行する$ find . -name "*.txt" -printf "mv %p %h/..\n" | bash
使用例¶
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オプションではなく、パスの末尾に
/
を付ける方法もあります。
- -Hオプションではなく、パスの末尾に