find
コマンドについて説明します。
※ 本ページで扱うのは、find (GNU findutils) 4.7.0-git です。
1. find
コマンドの使い方
find
コマンドの基本的な使い方は以下のように使います。
$ find パス 式
動作としては、「パス」で指定したディレクトリ以下(再帰的に検索します)から、「式」で指定した条件にマッチするファイル・ディレクトリを検索します。
式 (EXPRESSION)
式 は以下のパートに分けることができ、単に検索する以上のことができるのが find
コマンドのすごいところです。
主なグローバルオプション、判別式、アクションを表にしました。
man ページの説明と独自の説明を合わせて追加してあります。
※ ポジショナルオプションはあまり使わないので省略しました。
オプション | 説明 |
---|---|
-maxdepth levels | コマンドライン引き数として指定したパスから最大 levels 段階下の ディレクトリまで探索する (levels は非負の整数)。 |
-depth | ディレクトリそのものより先に、ディレクトリの中身を処理する。 |
判別式 | 説明 |
---|---|
-name pattern |
|
-iname pattern | -name と同じだが、大文字小文字を区別しない。 |
-path pattern |
|
-type c |
|
-size ±n[cwbkMG] |
|
-cmin n |
ファイルの最終ステータス変更日時が n 分前ならば真。 |
-mtime n |
ファイルの最終内容更新日時が n 日前ならば真。 |
-user uname |
ファイルの所有者が uname というユーザならば真 (ユーザ ID 番号で指定してもよい)。 |
-group gname | ファイルの属するグループが gname ならば真 (グループ ID 番号で 指定してもよい)。 |
アクション | 説明 |
---|---|
-exec command ; |
|
-exec command {} + |
|
-ls |
|
-print |
|
-print0 |
|
-prune |
|
※ 式の中に -prune 以外のアクションが存在しない場合は、 式の結果が真になったすべてのファイルに対して -print が実行される。
演算子 | 説明 |
---|---|
( expr ) |
|
! expr |
|
expr1 expr2 |
|
expr1 -a expr2 |
|
expr1 -o expr2 |
|
演算子を使い、複数の式を組み合わせることができます。
式の動作
- 式の要素は、演算子で区切られます。
- 与えられた式を左から右に向かって優先順位の高いものから評価します。但し、括弧内が先に処理されます。
例
以下のコマンドは何をしていることになるでしょうか?
$ find . -maxdepth 3 -type f \( -name '*.py' -o -name '*.c' \) -ls
※ シェルとして bash を使っています。
答えは以下です。
- カレントディレクトリに対し、
- 最大3階層下の ディレクトリまで探す。
- 種類は「ファイル」であり、
- 且つ(ファイル名が *.c もしくは *.h にマッチするファイル)
- その結果に対して、詳細表示を行う。
2. コマンド実行例
(1) 名前が ‘*.c’ にマッチするファイルを表示する。
$ find . -type f -name '*.c'
- 「*.c」をクォートで囲むのを忘れないこと。
(2) 100分以内に更新したファイルを表示する。
$ find . -type f -cmin -100
(3) 100分以上前に更新したファイルを表示する。
$ find . -type f -cmin +100
(4) 10日以内に更新したファイルを表示する。
$ find . -type f -mtime -10
(5) 10日以上前に更新したファイルを表示する。
$ find . -type f -mtime +10
(6) カレントディレクトリ以下に存在するPNGファイルを、/tmp
ディレクトリに移動する
$ find . -type f -name '*.png' -exec mv -t /tmp {} +
mv
コマンドの-t
オプションは、移動先を指定している。- 1回の
mv
コマンド起動時に、なるべくたくさんのファイル名を渡してくれるので処理が速い。 -exec
アクションで 末尾に “+” を付ける場合は、”{}”は引数の最後に置かなければいけない。
(7) xargs
コマンドと組み合わせて使う場合
$ find . -print0 | xargs -0 grep hogehoge /dev/null
find
側では-print0
をセットし、xargs
側では-0
をセットする。- UNIX系のシステムでは、ファイル名として空白や改行を含むことができるが、
xargs
がこれを受け取った時、ファイル名の区切りだと認識してしまうのを防ぐため、ファイル名の区切り文字をヌル文字にする。 - 最後に
/dev/null
を指定しているのは、grep
コマンドによる出力の全ての行に、ファイル名を出力させるための小技です。(参照:コマンド:xargs: UNIX/Linuxの部屋)