Findコマンドまとめ

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アクションは、現在のファイルの名前を標準出力に表示します。-print
グローバルオプションコマンドラインのどの部分で指定されても、テストやアクションの動作に影響を与えます。グローバルオプションは常に真を返します。例えば、-depthオプションは、ファイルシステムを深さ優先でトラバースさせます。-depth
位置オプションそれ以降のテストやアクションにのみ影響を与えます。位置オプションも常に真を返します。例えば、-regextypeオプションは、後でコマンドラインに現れる正規表現の方言を指定します。-regextype

GLOBAL OPTIONS(グローバルオプション)

グローバルオプションは常に真を返します。グローバルオプションは、コマンドライン上でそれより前に現れるテストに対しても有効です。混乱を避けるために、グローバルオプションは開始点のリストの後、最初のテスト、位置オプション、またはアクションの直前に指定するべきです。他の場所でグローバルオプションを指定すると、findはこの指定が混乱を招く可能性があるという警告メッセージを表示します。

オプション説明
-help, –helpfindのコマンドライン使用法の概要を表示し、終了します。
-maxdepth levels開始点の下で最大でlevels(非負整数)のディレクトリ層を降りることを指定します。-maxdepth 0を使用すると、テストやアクションは開始点自体にのみ適用されます。
-mindepth levelslevels(非負整数)よりも浅いレベルでテストやアクションを適用しません。-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 を指定できます。

数値引数説明
+nn より大きい場合
-nn より小さい場合
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 / -nn 日以上/以内にアクセスされたファイルを検索find . -atime -7 → 7日以内にアクセス
-ctime +n / -nn 日以上/以内に変更されたファイルを検索find . -ctime +30 → 30日以上前に変更
-mtime +n / -nn 日以上/以内に修正されたファイルを検索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 {} \;
-lsls -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

コメント

タイトルとURLをコピーしました