find コマンド
find コマンドは、指定したディレクトリ内でファイルやディレクトリを検索するために使用されます。名前、サイズ、作成日、ファイルタイプなど、さまざまな条件で検索を行うことができます。
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [開始点…] [式]
オプション | 説明 |
---|---|
-P | シンボリックリンクを決してたどらない。これはデフォルトの動作です。findがファイルの情報を調べたり表示したりする際、シンボリックリンク自体のプロパティが使用されます。 |
-L | シンボリックリンクをたどる。findがファイルの情報を調べたり表示したりする際、リンク自体ではなく、リンクが指すファイルのプロパティが使用されます(リンクが壊れている場合やリンク先のファイルを調べられない場合を除く)。このオプションの使用は -noleaf を意味します。 |
-H | 検索の開始パスがシンボリックリンクの場合、そのリンクを辿るが、それ以降のシンボリックリンクは辿らない。 |
-D debugopts | 診断情報を表示します。これは、findが期待通りに動作しない理由を診断するのに役立ちます。debugオプションのリストはカンマで区切ります。debugオプションの互換性はfindutilsのリリース間で保証されません。 |
-Olevel | クエリの最適化を有効にします。findプログラムはテストを再編成して実行速度を向上させますが、全体の効果は維持されます。副作用のあるプレディケートはお互いの相対位置が変更されません。 |
find-test-file1を検索
テスト用のファイルを作成
# 作業用ディレクトリの作成 mkdir -p ~/work/test-dir && \ # カレントディレクトリの移動 cd ~/work && \ # テスト用のファイル作成 echo find-test-file1 > test-dir/find-test-file1 && \ # シンボリックリンクの作成 ln -s test-dir test-dir-link && \ # テスト用のファイルとシンボリックリンクが作成されたことを確認 ls -Rl

名前が「find」から始まるファイルを検索。./test-dir/ 配下に存在することを確認
find -name "find*"

シンボリックリンクを辿って検索。こちらも同じように表示される
find -H test-dir-link -name "find*"

「-P」はシンボリックリンクを辿って検索しません。そのため何も表示されませんでした。
find -P test-dir-link -name "find*"

EXPRESSION(式)
コマンドラインの開始点のリストの後に続く部分が「式」です。これはファイルをマッチさせる方法と、マッチしたファイルに対して何をするかを定義するクエリ仕様のようなものです。式は以下の要素で構成されます。
カテゴリ | 説明 | 例 |
---|---|---|
テスト | 通常ファイルの属性に基づいて真または偽の値を返します。例えば、-emptyテストは、ファイルが空である場合にのみ真を返します。 | -empty |
アクション | 副作用を持ち(標準出力に何かを表示するなど)、通常、成功したかどうかに基づいて真または偽を返します。例えば、-printアクションは、現在のファイルの名前を標準出力に表示します。 | |
グローバルオプション | コマンドラインのどの部分で指定されても、テストやアクションの動作に影響を与えます。グローバルオプションは常に真を返します。例えば、-depthオプションは、ファイルシステムを深さ優先でトラバースさせます。 | -depth |
位置オプション | それ以降のテストやアクションにのみ影響を与えます。位置オプションも常に真を返します。例えば、-regextypeオプションは、後でコマンドラインに現れる正規表現の方言を指定します。 | -regextype |
GLOBAL OPTIONS(グローバルオプション)
グローバルオプションは常に真を返します。グローバルオプションは、コマンドライン上でそれより前に現れるテストに対しても有効です。混乱を避けるために、グローバルオプションは開始点のリストの後、最初のテスト、位置オプション、またはアクションの直前に指定するべきです。他の場所でグローバルオプションを指定すると、findはこの指定が混乱を招く可能性があるという警告メッセージを表示します。
オプション | 説明 |
---|---|
-help, –help | findのコマンドライン使用法の概要を表示し、終了します。 |
-maxdepth levels | 開始点の下で最大でlevels(非負整数)のディレクトリ層を降りることを指定します。-maxdepth 0を使用すると、テストやアクションは開始点自体にのみ適用されます。 |
-mindepth levels | levels(非負整数)よりも浅いレベルでテストやアクションを適用しません。-mindepth 1を使用すると、開始点を除くすべてのファイルを処理します。 |
ディレクトリの階層を指定して検索
テスト用のファイルを作成
# 作業用ディレクトリの作成 mkdir -p ~/work/dir1/dir2/dir3 && \ # カレントディレクトリの移動 cd ~/work && \ # テスト用のファイル作成 touch dir1/dir2/test-file1 dir1/dir2/dir3/test-file2 && \ # ディレクトリの構造を確認 tree

dir1から2階層目までのディレクトリ内で検索。そのためtest-file1しか表示されない
find dir1 -maxdepth 2 -type f

dir1から3階層目から検索したためtest-file2のみ表示される
find dir1 -mindepth 3 -type f

TESTS(テスト)
例えば -newerXY や -samefile などの一部のテストでは、現在調査中のファイルと、コマンドラインで指定された参照ファイルを比較できます。
これらのテストを使用する場合、参照ファイルの解釈は -H、-L、-P オプションや、それまでに指定された -follow によって決まります。ただし、参照ファイルはコマンドラインが解析される時点で一度だけ調査されます。
もし参照ファイルを調査できない場合(例えば stat(2) システムコールが失敗した場合)、エラーメッセージが表示され、find は非ゼロのステータスで終了します。
-amin、-mtime、-gid、-inum、-links、-size、-uid、-used などのテストには、数値引数 n を指定できます。
数値引数 | 説明 |
---|---|
+n | n より大きい場合 |
-n | n より小さい場合 |
n | ちょうど n の場合 |
以下の表に find
コマンドでよく使われるテストをまとめました
オプション | 説明 | 使用例 |
---|---|---|
-name "pattern" | 指定したパターンに一致するファイルを検索 | find . -name "*.txt" → .txt ファイルを検索 |
-iname "pattern" | -name と同じ(大文字・小文字を区別しない) | find . -iname "*.JPG" → .jpg , .JPG に一致 |
-type {f,d,l} | ファイルタイプを指定 ( f : 通常ファイル, d : ディレクトリ, l : シンボリックリンク) | find . -type d → ディレクトリのみ検索 |
-size +nM / -nM | サイズが n メガバイト以上/以下のファイルを検索 | find . -size +100M → 100MB 以上のファイル |
-empty | 空のファイルまたはディレクトリを検索 | find . -empty |
-executable | 実行可能なファイルを検索 | find . -type f -executable |
-perm mode | 指定のパーミッションを持つファイルを検索 | find . -perm 755 |
-user username | 指定したユーザーが所有するファイルを検索 | find /home -user alice |
-group groupname | 指定したグループが所有するファイルを検索 | find /var -group admin |
-nouser | 所有者が存在しないファイルを検索 | find / -nouser |
-nogroup | グループが存在しないファイルを検索 | find / -nogroup |
-atime +n / -n | n 日以上/以内にアクセスされたファイルを検索 | find . -atime -7 → 7日以内にアクセス |
-ctime +n / -n | n 日以上/以内に変更されたファイルを検索 | find . -ctime +30 → 30日以上前に変更 |
-mtime +n / -n | n 日以上/以内に修正されたファイルを検索 | find . -mtime -1 → 24時間以内に修正 |
-newer file | 指定した file より新しいファイルを検索 | find . -newer reference.txt |
type一覧
種類 | 説明 |
---|---|
b | ブロック (バッファリングされた) 特殊ファイル |
c | キャラクター (バッファリングされない) 特殊ファイル |
d | ディレクトリ |
p | 名前付きパイプ (FIFO) |
f | 通常ファイル |
l | シンボリックリンク; -L オプションまたは -follow オプションが有効な場合は常に false ただし、シンボリックリンクが壊れている場合は例外。-L が有効な場合にシンボリックリンクを検索するには -xtype を使用 |
s | ソケット |
よくあるTESTのパターン
テスト用のファイルを作成
# 作業用ディレクトリの作成 mkdir -p ~/work/dir1/dir2/dir3 && \ # カレントディレクトリの移動 cd ~/work && \ # テスト用のファイル作成 touch dir1/dir2/test-file1 dir1/dir2/dir3/test-file2 dir1/find-file && \ # ディレクトリの構造を確認 tree

ファイルが0バイト(-empty)かつファイル名にfindと入るファイルを検索
find dir1 -empty -name find*

ディレクトリのみ表示
find dir1 -type d

10日以内に変更があったファイルを検索
find -ctime -10 -type f

10日以上前に変更があった、/etc/sshの配下のファイルを検索
sudo find /etc/ssh/ -ctime +10 -type f | sudo xargs ls -l

Actions
アクションは副作用を持ち(例えば、標準出力に何かを表示するなど)、通常は成功したかどうかに基づいて true
または false
を返します。
例えば、-print
アクションは、現在のファイルの名前を標準出力に表示します。
ACTION | 説明 | 使用例 |
---|---|---|
-print | 検索結果を標準出力に表示 | find . -name "*.txt" -print |
-delete | 検索結果のファイルを削除(慎重に使用) | find /tmp -type f -name "*.log" -delete |
-exec command {} \; | 検索結果ごとにコマンドを実行 | find . -name "*.log" -exec rm {} \; |
-exec command {} + | 検索結果をまとめてコマンドに渡す(高速) | find . -name "*.log" -exec rm {} + |
-execdir command {} \; | -exec と似ているが、対象のディレクトリで実行(安全) | find . -type f -name "*.sh" -execdir chmod +x {} \; |
-ok command {} \; | -exec の確認付きバージョン | find . -name "*.tmp" -ok rm {} \; |
-ls | ls -dils 形式で検索結果を表示 | find /var/log -type f -ls |
-fls file | -ls の結果をファイルに保存 | find . -type f -fls found_files.txt |
-fprint file | 検索結果を指定ファイルに保存 | find . -type f -name "*.log" -fprint found_logs.txt |
-prune | 指定ディレクトリ以下を検索対象外にする | find . -path "./node_modules" -prune -o -name "*.js" -print |
Actionsの使い方
テスト用のファイルを作成
# 作業用ディレクトリの作成 mkdir -p ~/work/dir1/dir2/dir3 && \ # カレントディレクトリの移動 cd ~/work && \ # テスト用のファイル作成 echo これはtest-file1 > dir1/dir2/test-file1 && \ echo これはtest-file2 > dir1/dir2/dir3/test-file2 && \ echo これはfind-file > dir1/find-file && \ # ディレクトリの構造を確認 tree

test*という名前から始まるファイルの中身をcatで確認
find . -type f -name "test*" -execdir cat {} \;

10日以内の変更したファイルで他のプロセスによって開かれていなければ削除
find . -ctime -10 -type f -exec sh -c 'lsof "$1" >/dev/null || rm -i "$1"' _ {} \;

./dir1/find-fileはlessコマンドによって開かれているため削除の対処にならなかった
find . -ctime -10 -type f -exec lsof {} \;

削除したファイルをdeleted.logに記載する
find . -ctime -10 -type f -exec sh -c 'lsof "$1" >/dev/null || { echo "$1" >> deleted.log; rm "$1"; }' _ {} \;

deleted.logに削除されたファイル名が記載されている
cat deleted.log

コメント