findはファイルやディレクトリを検索するコマンドだ。
作成したファイルがどこにあるかわからなくなった時はもちろん、Linuxを利用する上で設定ファイルを探すということはよくあることだ。
このページでは、findコマンドの基本的な使用方法の解説に併せ、便利な使い方も紹介する。
ぜひ参考にしてほしい。
目次
- 1 findコマンドの基本
- 2 findコマンドの便利な判別式や演算子、アクションたち
- 2.1 判別式や演算子、アクションの一覧
- 2.2 -name:ワイルドカードを使用して、ファイルやディレクトリ名の一部のみを指定し検索する
- 2.3 -atime:任意の日数にアクセスされたファイルやディレクトリを検索する
- 2.4 -mtime:任意の日数に更新されたファイルやディレクトリを検索する。
- 2.5 -amin:任意の分数以前にアクセスされたファイルやディレクトリを検索する
- 2.6 -mmin:任意の時間に更新されたファイルやディレクトリを検索する。
- 2.7 -anewer:任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。
- 2.8 -newer:任意のファイルの更新日時よりも後に更新したファイルやディレクトリを検索する
- 2.9 -empty:ファイルやディレクトリの容量がないものを検索する
- 2.10 -size:ファイルの容量を指定し検索する
- 2.11 -type f :ファイルのみを対象とし検索する
- 2.12 -type d :ディレクトリを対象とし検索する
- 2.13 -perm:パーミッションで検索する
- 2.14 -and:複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する
- 2.15 -or:複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する
- 2.16 -not:条件に当てはまらないファイルやディレクトリを検索する
- 2.17 -exec:検索結果に対してコマンドを実行する
- 3 findコマンドと類似のコマンド群
findコマンドの基本
findコマンドの基本動作
findは、その通り検索のコマンドだ。ファイルやディレクトリを検索する。
基本的な書式は次のようになる。
$ find ファイル名
findに続き、検索するファイル名を指定する。
例えば、workディレクトリ内のtest01.datを検索する場合は、次のようになる。
$ find ./work/test01.dat
workディレクトリ内のtest01.datが検索された。
上記findコマンドを試すなら下のコマンドをLinux上で実行すればすぐに再現可能だ。
1 2 3 4 5 6 7 8 |
touch ./work/test01.dat touch ./work/test02.dat touch ./work/test03.dat touch ./work/test04.dat touch ./work/sample01.dat touch ./work/sample02.dat ls -l ./work/ find ./work/test01.dat |
検索するファイルがなければエラーが表示される。
workディレクトリ内のtest10.datは存在しないが、検索してみる。
$ find ./work/test10.dat
「そのようなファイルやディレクトリはありません」とエラーが表示された。
1 2 |
ls -l ./work/ find ./work/test10.dat |
findコマンドの便利な判別式や演算子、アクションたち
判別式や演算子、アクションの一覧
後から詳細をご紹介するが、まずは一覧で見てみよう。
判別式 -name
ワイルドカードを使用して、ファイルやディレクトリ名の一部のみ指定した検索ができる。
判別式 -atime
任意の日数にアクセスされたファイルやディレクトリを検索する。
判別式 -mtime
任意の日数に更新されたファイルやディレクトリを検索する。
判別式 -amin
任意の分数にアクセスされたファイルやディレクトリを検索する。
判別式 -mmin
任意の分数に更新されたファイルやディレクトリを検索する。
判別式 -anewer
任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。
判別式 -newer
任意のファイルの更新日時よりも後に変更したファイルやディレクトリを検索する。
判別式 -empty
ファイル容量が0のファイルやディレクトリを対象とし検索する。
判別式 -size
ファイル容量を指定し検索する。
判別式 -type f
ファイルのみを対象とし検索する。
判別式 -type d
ディレクトリを対象とし検索する。
判別式 -perm
パーミッションで検索する。
演算子 -and
複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する。
演算子 -or
複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する。
演算子 -not
条件に当てはまらないファイルやディレクトリを検索する
アクション -exec
検索結果に対してコマンドを実行する。
かなり長くなってしまったが、それぞれ詳細を紹介していく。
-name:ワイルドカードを使用して、ファイルやディレクトリ名の一部のみを指定し検索する
ファイル名やディレクトリ名が一部しかわからない場合でもワイルドカードを使って検索できる。
ワイルドカードは直前に「\」でエスケープしないとエラーや想定した動作にならない。
$ find 検索先 -name ファイル名
workディレクトリ内の拡張子.datのファイルを検索する場合は、次のとおりだ。
$ find work -name \*.dat
拡張子.datのファイルのみ表示された。
1 2 |
ls -l ./work/ find work -name \*.dat |
-nameを記述せずに、
$ find ./work/ *.dat
と記述することで、同じ動作をすることもできる。
-atime:任意の日数にアクセスされたファイルやディレクトリを検索する
指定した日にアクセスしたファイルやディレクトリを検索できる判別式だ。
日数は、今日が0、昨日が1である。
$ find 検索先 -atime 日数
今日アクセスしたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -atime 0
今日アクセスされたファイルが表示された。
1 2 3 4 5 6 7 8 9 10 |
rm ./work/* touch ./work/test01.dat touch -a -d "-2day" ./work/test02.dat touch -m -d "-7day" ./work/test02.dat touch -a -d "-3day" ./work/test03.dat touch -m -d "-30day" ./work/test03.dat touch -a -d "-4day" ./work/test04.dat touch -m -d "-30day" ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime 0 |
任意の日数以内にアクセスされたファイルやディレクトリをすべて表示したい場合は、日数に-を付ける。
3日以内にアクセスされたファイルやディレクトリを検索する場合は、次のとおりだ。
$ find ./work/ -atime -3
今日から3日以内にアクセスされたファイルが表示された。
1 2 |
ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime -3 |
任意の日数前までにアクセスされたファイルやディレクトリをすべて表示したい場合は、日数に+を付ける。
3日よりも前にアクセスされたファイルやディレクトリを検索する場合は、次のとおりだ。
$ find ./work/ -atime +3
今日から3日よりも前にアクセスされたファイルが表示された。
1 2 |
ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime +3 |
-mtime:任意の日数に更新されたファイルやディレクトリを検索する。
指定した日に変更を行ったファイルやディレクトリを検索できる判別式だ。
日数は、今日が0、昨日が1である。
$ find -mtime 日数
今日変更を行ったファイルを検索する場合は、次のとおりだ。
$ find -mtime 0
今日変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime 0 |
任意の日数以内に変更を行ったファイルをすべて表示したい場合は、日数に-を付ける。
10日以内に変更されたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -mtime -10
10日以内に変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime -10 |
任意の日数前までに変更を行ったファイルをすべて表示したい場合は、日数に+を付ける。
20日よりも前に変更されたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -mtime +20
20日より前に変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime +20 |
-amin:任意の分数以前にアクセスされたファイルやディレクトリを検索する
指定した時間にアクセスしたファイルやディレクトリを検索できる判別式だ。
$ find 検索先 -amin 分数
直前にアクセスしたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -amin 1
直前にアクセスされたファイルが表示された。
1 2 3 4 5 6 7 8 9 10 |
rm ./work/* touch ./work/test01.dat touch -a -d "-15min" ./work/test02.dat touch -m -d "-600min" ./work/test02.dat touch -a -d "-20min" ./work/test03.dat touch -m -d "-3600min" ./work/test03.dat touch -a -d "-30min" ./work/test04.dat touch -m -d "-3600min" ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin 1 |
任意の時間以内にアクセスされたファイルをすべて表示したい場合は、分に-を付ける。
25分以内にアクセスされたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -amin -25
今から25分以内にアクセスされたファイルが表示された。
1 2 |
ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin -25 |
任意の時間の前までにアクセスされたファイルをすべて表示したい場合は、分に+を付ける。
25分よりも前にアクセスされたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -amin +25
今から25分よりも前にアクセスされたファイルが表示された。
1 2 |
ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin +25 |
-mmin:任意の時間に更新されたファイルやディレクトリを検索する。
指定した時間に変更を行ったファイルの場所を検索できる判別式だ。
$ find -mtime 分数
今変更を行ったファイルを検索する場合は、次のとおりだ。
$ find -mmin 1
今変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin 1 |
任意の時間までに変更を行ったファイルをすべて表示したい場合は、分数に-を付ける。
12時間以内に変更されたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -mmin -720
12時間(720分)以内に変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin -720 |
任意の時間までに変更を行ったファイルをすべて表示したい場合は、分数に+を付ける。
20時間よりも前に変更されたファイルを検索する場合は、次のとおりだ。
$ find ./work/ -mmin +1200
20時間(1200分)より前に変更されたファイルが表示された。
1 2 |
ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin +1200 |
-anewer:任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。
あるファイルの更新日時と比べて、アクセスした時間がそれ以降のファイルを検索する。
$ find 検査元 -anewer 元ファイル名
workディレクトリ内のtest02.datの変更日時よりも後にアクセスしたworkディレクトリ内のファイルを検索する場合は、次のとおりだ。
$ find ./work/ -anewer ./work/test02.dat
1 2 3 4 5 6 7 8 9 10 |
rm ./work/* touch ./work/test01.dat touch -a -d "-15min" ./work/test02.dat touch -m -d "-25min" ./work/test02.dat touch -a -d "-20min" ./work/test03.dat touch -m -d "-30min" ./work/test03.dat touch -a -d "-30min" ./work/test04.dat touch -m -d "-40min" ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -anewer ./work/test02.dat |
-newer:任意のファイルの更新日時よりも後に更新したファイルやディレクトリを検索する
あるファイルの更新日時と比べて、更新した時間がそれ以降のファイルを検索する。
$ find 検査元 -newer 元ファイル名
workディレクトリ内のtest03.datの変更日時よりも後に更新したworkディレクトリ内のファイルを検索する場合は、次のとおりだ。
$ find ./work/ -newer ./work/test03.dat
1 2 |
ls -l ./work/ #最終更新日時を表示 find ./work/ -newer ./work/test03.dat |
-empty:ファイルやディレクトリの容量がないものを検索する
空のものを検索する判別式だ。
$ find 検査元 -empty
workディレクトリ内のファイル容量が0のものを検索する場合は、次のとおりだ。
$ find ./work/ -empty
1 2 3 4 |
echo TEST > ./work/test01.dat echo TEST01 > ./work/test02.dat ls -la ./work/ find ./work/ -empty |
-size:ファイルの容量を指定し検索する
ファイルの容量を指定して検索する判別式だ。
初期設定では、ファイル容量が指定したものを検索する。
指定したファイル容量以上のものを検索する場合はファイル容量の前に+を、以下の場合はマイナスを付与する。
ファイル容量の後ろにcを付与すると単位がByteとなり、kを付与するとkByteとなる。
$ find 検索元 -size ファイル容量
workディレクトリ内のファイル容量が6byte以下のファイルを検索する場合は、次のとおりだ。
$ find ./work/ -size -6c
1 |
find ./work/ -size -6c |
-type f :ファイルのみを対象とし検索する
検索対象をファイルのみに限定して検索する判別式だ。検索対象のタイプに「file」を指定する形になる。
$ find ファイル名 -type f
workディレクトリ内のファイル名に01が含まれるファイルのみを検索する場合は、次のとおりだ。
$ find ./work/*01* -type f
1 2 3 4 |
mkdir ./work/Dir01 mkdir ./work/Dir02 ls -l ./work/ find ./work/*01* -type f |
-type d :ディレクトリを対象とし検索する
上の「-type f」と同じパターンだ。dを指定することで、検索対象をディレクトリのみに限定して検索する判別式になる。
$ find ディレクトリ名 -type d
workディレクトリ内のディレクトリ名に01が含まれるディレクトリのみを検索する場合は、次のとおりだ。
$ find ./work/*01* -type d
1 2 |
ls -l ./work/ find ./work/*01* -type d |
-perm:パーミッションで検索する
ある特定のパーミッションで検索する判別式だ。
$ find 検索元 -perm パーミッション
または
$ find 検索元 -perm -対象者=アクセス権
対象者は、所有者がu、グループがg、その他のユーザーがo、全対象者がaとなる。
アクセス権は、読み込み権限がr、書き込み権限がw、実行権限がxとなる。
workディレクトリ内のパーミッションが664を検索する場合は、次のとおりだ。
$ find ./work/ -perm 664
アクセス権限が664(-rw-rw-r--)のものが検索された。
1 2 3 |
chmod 766 ./work/test01.dat ls -l ./work/ find ./work/ -perm 664 |
workディレクトリ内の所有者が実行権限を持つものを検索する場合は、次のとおりだ。
$ find ./work/ -u=x
所有者に実行権限が設定されている(アクセス権限が-rwxrw-rw-)のものが検索された。
1 2 |
ls -l ./work/ find ./work/ -perm -u=x |
-and:複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する
複数の検索条件を使って、すべての条件が満たしているファイルやディレクトリのみを検索する演算子だ。
$ find 検索元 検索条件1 -and 検索条件2
workディレクトリ内の名称に2が入っていて、なおかつパーミッションが664のものを検索する場合は、次のとおりだ。
$ find ./work/ -name \*2\* -and -perm 664
ファイル名称に2が入っていて、なおかつ、アクセス権限が664(-rw-rw-r--)のものが検索された。
1 2 |
ls -l ./work/ find ./work/ -name \*2\* -and -perm 664 |
-or:複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する
複数の検索条件を使って、いずれかの条件を満たしているファイルやディレクトリを検索する演算子だ。
$ find 検索元 検索条件1 -or 検索条件2
workディレクトリ内の名称に4が入っている、またはパーミッションが766のものを検索する場合は、次のとおりだ。
$ find ./work/ -name \*4\* -or -perm 766
ファイル名称に4が入っている、または、アクセス権限が766(-rwxrw-rw-)のものが検索された。
1 2 |
ls -l ./work/ find ./work/ -name \*4\* -or -perm 766 |
-not:条件に当てはまらないファイルやディレクトリを検索する
検索条件に当てはまらないファイルやディレクトリを検索する演算子だ。
$ find -not 検索元 検索条件
workディレクトリ内の所有者に実行権限のないものを検索する場合は、次のとおりだ。
$ find ./work/ -not -perm -u=x
workディレクトリ内の所有者に実行権限があるものは検索されず、それ以外が検索された。
1 2 |
ls -l ./work/ find ./work/ -not -perm -u=x |
-exec:検索結果に対してコマンドを実行する
検索した結果に対して、何らかのアクションを自動で実行させることができるものだ。
$ find 検索元 検索ファイル名 -exec 実行するコマンド \;
workディレクトリ内の拡張子.datを探し、圧縮ファイルtest.zipに追加していく場合は、次のとおりだ。
*は\でエスケープする。また、対象となる全ファイルという意味で{}を記述している。
$ find ./work/ -name \*.dat -exec zip ./work/test.zip {} \;
workディレクトリ内の拡張子.datのファイルがtest.zipに次々と圧縮されている。
1 2 |
find ./work/ -name \*.dat -exec zip ./work/test.zip {} \; ls -l ./work/ |
workディレクトリ内のパーミッションが644のものを探し、パーミッションを666に変更する場合は、次のとおりだ。
$ find ./work/ -perm 664 -exec chmod 666 {} \;
workディレクトリ内のパーミッションが644のファイルのパーミッションが666に変更された。
1 2 3 |
ls -l ./work/ find ./work/ -perm 664 -exec chmod 666 {} \; ls -l ./work/ |
findコマンドと類似のコマンド群
最後にfindコマンドに関連して、基本的なファイル検索のコマンドも紹介しておく
grepコマンド
ファイルの中のワードで検索を行うコマンドだ。こちらもLinuxを使う上で必須コマンドになっている。
まとめ
findで検索できる形式は、名前、名前の一部、更新日時、ファイルサイズなどがある。検索した結果に対しては、他のコマンドを組み合わせることで何かの処理をすることも可能だ。
CMSをLinuxサーバーにインストールする作業の中では、ある条件のファイルのみにパーミッションを設定するような作業がよくある。そのような時はこのfindコマンドを使うことで効率がよくなるだろう。
findコマンドは基本のコマンドでありながら、応用性も高いコマンドなので、この機会にぜひ把握してほしいコマンドだ。
御社 findコマンドの説明において、重大な誤りがあります。
-name や -atime などのことを、十把一絡げに「オプション」と説明していますが、これはとんでもない誤りです。GNU findutils を対象としているとの前提で言いますが、Info ファイルを熟読すべきです。-name はテストとよびます。-a は演算子と呼びます。-exec はアクションと呼びます。オプションと呼べるのは、たとえば -regextype です。なおここで言う「オプション」は、通常よく用いられるコマンドライン上のオプションとは全く違う用語です。そのことも Info に明記されています。-name や -atime などをオプションと呼ぶ表現は、公式文書には存在しません。熟読の上、訂正すべきです。
追記したい内容があるので、続けます。なお前コメントの続きとして、「オプション」という用語は find において特別な意味を設けて用いられており、それは「特定のファイル処理に対してではなく、全体的な処理に影響を及ぼす指定要素」のこと、と Info に記載されています。だから -name や -atime はこれに該当しないのです。これとは別の話として、-a を掲載せずに -and を説明されています。Linux 前提であれば、仕方ないことですが、ちなみに -and は POSIX 準拠していません。無難に -a を説明するべきではありませんか? 御社のポリシーに関わるところと思います。
いつもご愛読ありがとうございます。
記事に反映させていただきました。
ご指摘ありがとうございました。