記事最終更新日:2017年08月20日
記事投稿日:2017年02月25日
閲覧数:5839 views
findコマンドの使い方メモ -【Unix&Linux&Mac】

はじめに
今回のD.M.C.【デベメモドットコム】の記事は「findコマンドの使い方」ということで、LinuxやMacなどUnix系列のOSで使用される「findコマンド」について、使い方や各種オプションなどの組み合わせを詳しくメモ(解説)していきます。
はじめに「findコマンド」で何ができるのかというと、簡単に説明するとはファイルやディレクトリを検索するコマンドです。
ただ非常に高機能で、様々な オプションや条件でファイル・ディレクトリ(フォルダ)を検索することができます。
また以前の記事で書いた「リダイレクト・パイプの使い方」)で紹介したパイプライン等を組み合わせることによって、検索されたファイル・ディレクトリ(フォルダ)の結果に対して別のコマンド実行することもできます。
ファイル・ディレクトリ(フォルダ)を検索してくれるといっても基本的な使い方から様々なオプションを組み合わせることによって、たくさんの事が出来るので、基本的な使い方からオプションの組み合わせまで、この記事では詳しく解説していけたらと思います。
基本的な使い方
まずは基本的な使い方を解説していきます。
「findコマンド」の第一引数は検索対象のパスを指定します。下記のコマンドでは現在いるカレントディレクトリ以下のファイル・ディレクトリ(フォルダ)一覧が表示されます。
$ find .
「-name」オプションでファイル名を指定して検索
「findコマンド」はファイル・ディレクトリ(フォルダ)の名前を指定して検索する事が出来ます。
第一引数は「基本的な使い方」で説明した時と同じで検索対象のパスを指定します。そして第二引数に「-name」オプションを指定して、続けて文字列で検索したい名前を指定します。
$ find . -name "filename"
カレントディレクトリ以下で「index.html」を検索したい場合は、下記のようになります。
$ find . -name "index.html"
また「-iname」オプションを指定する事によって、大文字・小文字を区別せずに検索する事も出来ます。
$ find . -iname "FILENAME"
下記のように指定すると、カレントディレクトリ以下に「index.html」があれば大文字・小文字を気にせずに検索して見つけることができます。
$ find . -name "INDEX.HTML"
「-type」オプションでタイプを指定して検索
「findコマンド」はファイルタイプを指定して種類別に検索する事もできます。
第一引数に検索対象のパスを指定して、第二引数に「-type」オプションを指定します。
$ find . -type
今回は仕様頻度の高い3つのタイプを紹介します。
1つ目は「-type」に続けて「f」をつけてください。
「f」はファイルのみを表示させる事が出来ます。
$ find . -type f
2つ目は「-type」に続けて「d」をつけてください。
「d」をつける事によってディレクトリ(フォルダ)のみ表示させる事が出来ます。
$ find . -type d
最後の3つ目は「-type」に続けて「l」をつけてみてください。
「l」をつけるとシンボリックリンクのみを表示させる事が出来ます。
$ find . -type l
「-empty」オプションで空ファイル・空ディレクトリを検索
「findコマンド」は空ファイル・空ディレクトリを検索する事もできます。
第一引数に検索対象のパスを指定して、第二引数に「-empty」オプションを指定します。
空ファイル・空ディレクトリの両方を出力させたい場合は下記のようにします。
$ find . -empty
空ファイルのみ検索したい場合は、「-type」オプションを組み合わせて「f」を指定して下記のようにする。
$ find . -empty -type f
空ディレクトリのみ検索したい場合は、「-type」オプションを組み合わせて「d」を指定して下記のようにする。
$ find . -empty -type d
「-or」「-and」オプションで複数条件を指定して検索
「findコマンド」は条件を複数指定して検索する事も出来ます。
下記コマンドはカレントディレクトリ以下を名前検索とファイルタイプを指定する事によって絞り込み、ディレクトリ(フォルダ)を除いた拡張子がhtmlのファイルを検索しています。
$ find . -name "*.html" -type f
またどちらか片方を満たした場合に出力させるには「-or」オプションを指定する事によって検索する事も出来ます。
下記の内容は拡張子がhtmlのファイル“または”拡張子がcssのファイルを検索しています。
$ find . -name "*.html" -or -name "*.css"
“かつ”どちらも満たした場合に出力させるには「-and」オプションを指定することによって検索する事も出来ます。
下記の内容はカレントディレクトリ以下を対象に拡張子がhtml“かつ”ファイルタイプがファイルのものを検索しています。
$ find . -name "*.html" -and -type f
「-not」「!」オプションで除外ファイルを指定して検索
「findコマンド」はオプションを指定する事によって、あらかじめ除外するファイルを指定して検索することもできます。
$ find . -not 条件
下記の例では「-not」オプションと「-name」オプションを組み合わせ「index.html」を除外した上で検索をおこなっています。
$ find . -not -name "index.html"
また意味は同じですが書き方の違いで「-not」は「!」と書く事もできます。
$ find . ! 条件
上記と同じで「index.html」を除外した上で検索したい場合は下記のようにします。
$ find . ! -name "index.html"
「-exec」オプション検索結果に対して別コマンド実行
「findコマンド」は検索結果に対して、さらに続けてコマンドを実行する事もできます。
検索結果に対して、さらにコマンドを実行するには下記のようにします。
$ find . -exec コマンド {} \;
よくあるのは検索結果の全ファイルに対してパーミッションを変更したりする作業だと思います。
例として拡張子「html」のファイルすべてに「600」のパーミッションにして、所有者だけ読み書きできるようにするには下記のようにします。
$ find . -name "*.html" -type f -exec chmod 600 {} \;
別コマンドを実行できるのは凄く便利なのですが、便利さゆえに検索結果すべてに対して削除を行う場合等は大変危険ですので、実行される前に本当に実行していいかファイル毎に確認チェックする事が出来ます。
そういった場合は「-exec」の部分を「-ok」に変更する事でファイル毎に確認しながら実行する事が出来ます。
$ find . -ok コマンド {} \;
先ほどのコマンドを例にすると下記のようになります。
$ find . -name "*.html" -type f -ok chmod 600 {} \;
「-amin」オプションで~分前にアクセスされたファイルを検索
「findコマンド」はファイルのタイムスタンプを元に分単位でファイル・ディレクトリ(フォルダ)を検索することができます。
「〜分前」にアクセスがあったかを指定して検索するには下記のようにします。
$ find . -amin 分
「〜分以上前」にアクセスがあったかを指定して検索するには下記のようにします。
$ find . -amin +分
「〜分以下前」にアクセスがあったかを指定して検索するには下記のようにします。
$ find . -amin -分
「-atime」オプションで~日前にアクセスされたファイルを検索
「findコマンド」はファイルのタイムスタンプを元に日単位でファイル・ディレクトリ(フォルダ)を検索することができます。
「〜日前」にアクセスがされたかを指定して検索するには下記のようにする
$ find . -atime 日
「〜日以上前」にアクセスがあったかを指定して検索するには下記のようにします。
$ find . -atime +分
「〜日以下前」にアクセスがあったかを指定して検索するには下記のようにします。
$ find . -atime -分
「-cmin」オプションでファイルステータス変更~分前を指定して検索
「findコマンド」はファイルステータスの変更日時を指定して検索する事も出来ます。
「〜分前」にファイルステータス変更されたかを検索するには下記のようにします。
$ find . -cmin 分
〜分以上前」にファイルステータス変更されたかを検索するには下記のようにします。
$ find . -cmin +分
「〜分以下前」にファイルステータス変更されたかを検索するには下記のようにします。
$ find . -cmin -分
「-ctime」オプションでファイルステータス変更~日前を指定して検索
「findコマンド」はファイルステータス変更~日前を指定して検索する事も出来ます。
「〜日前」にファイルステータスが変更されたかを検索するには下記のようにします。
$ find . -ctime 日
「〜日以上前」にファイルステータスが変更されたかを検索するには下記のようにします。
$ find . -ctime +日
「〜日以下前」にファイルステータスが変更されたかを検索するには下記のようにします。
$ find . -ctime -日
「-mmin」オプションでファイル変更の~分前を指定して検索
「findコマンド」はファイル変更の~分前を指定して検索する事も出来ます。
「〜分前」にファイル変更されたかを検索するには下記のようにします。
$ find . -mmin 分
「〜分以上前」にファイル変更されたかを検索するには下記のようにします。
$ find . +mmin 分
「〜分以下前」にファイル変更されたかを検索するには下記のようにします。
$ find . -mmin 分
「-mtime」オプションでファイル変更の~日前を指定して検索
「findコマンド」はファイル変更の~日前を指定して検索する事も出来ます。
「〜日前」にファイル変更されたかを検索するには下記のようにします。
$ find . -mtime 日
「〜日以上前」にファイル変更されたかを検索するには下記のようにします。
$ find . +mtime 日
「〜日以下前」にファイル変更されたかを検索するには下記のようにします。
$ find . -mtime 日
「-size」オプションでファイル・ディレクトリサイズを指定して検索
「findコマンド」は「-size」オプションを指定する事によって、ファイルサイズで検索する事もできます。
「c」はバイトサイズを指定して検索する事ができます。
$ find . -size サイズc
「k」はバイトサイズを指定して検索する事ができます。
$ find . -size サイズk
「M」はバイトサイズを指定して検索する事ができます。
$ find . -size サイズM
「G」はバイトサイズを指定して検索する事ができます。
$ find . -size サイズG
またぴったりサイズではなく、以上・以下で検索する事もできます。
サイズ以上を出力させたい場合は下記のようにする
$ find . -size +サイズ
サイズ以下を出力させたい場合は下記のようにする
$ find . -size -サイズ
「-perm」オプションでパーミッションを指定して検索
パーミッションでファイル・ディレクトリを検索する事も出来ます。
$ find . -perm パーミッション
「644」のパーミッションのファイルを検索するには下記のようにします。
$ find . -type f -perm 644
「-user」オプションでユーザーを指定して検索
ユーザを指定してファイル・ディレクトリ検索する事もできます。
$ find . -user ユーザ名
「root」ユーザのファイルを指定して検索する場合は下記のようにする。
$ find . -type f -user root
「-group」オプションでグループ名を指定して検索
グループを指定してファイル・ディレクトリ検索する事も出来ます。
$ find . -group グループ名
「staff」グループのファイルを検索する場合は下記のようにします。
$ find . -type f -group staff
「-regex」オプションで正規表現を指定して検索
「-regex」オプションを指定する事によって、正規表現を使用して検索する事もできます。
下記の内容は拡張子が「html」のファイルを検索しています。
$ find . -regex ".*\\.html$"
「-maxdepth」「-mindepth」オプションで階層を制限して検索
階層を制限して検索する事も出来ます。
$ find . -maxdepth 階層
カレントディレクトリ以下の階層を3階層までに制限する場合は下記のようにする。
$ find . -maxdepth 3
逆の階層を指定して検索する事もできます。
$ find . -mindepth 階層
第一階層、第二階層を無視して検索するには下記のようにする。
$ find . -mindepth 3
findコマンドオプション一覧
findコマンドオプションのまとめ一覧
-name | ファイル名を指定して検索 |
---|---|
-type | タイプを指定して検索 |
-type | 空ファイル・空ディレクトリを検索 |
-or | 「または」複数条件を指定して検索 |
-and | 「かつ」複数条件を指定して検索 |
-not | 除外ファイルを指定して検索 |
! | 除外ファイルを指定して検索 |
-exec | 検索結果に対して別コマンド実行 |
-amin | ~分前にアクセスされたファイルを検索 |
-atime | ~日前にアクセスされたファイルを検索 |
-cmin | ファイルステータス変更~分前を指定して検索 |
-ctime | ファイルステータス変更~日前を指定して検索 |
-mmin | ファイル変更の~分前を指定して検索 |
-mtime | ファイル変更の~日前を指定して検索 |
-size | ファイル・ディレクトリサイズを指定して検索 |
-perm | パーミッションを指定して検索 |
-user | ユーザーを指定して検索 |
-group | グループ名を指定して検索 |
-regex | 正規表現を指定して検索 |
-maxdepth | 階層を制限して検索 |
-mindepth | 階層を制限して検索 |
おまけ
「findコマンド」は単体でも強力ですが別のコマンドと組み合わせる事でもっと柔軟性のある使い勝手のいいコマンドになります。
「grep」や「sed」等、組み合わせると便利なコマンドはたくさんあるのですが、今回は「xargs」コマンドとの組み合わせでを少しだけ見ていきたいと思います。
まず「xargsコマンド」は標準入力から値を受け取り、まとめてコマンドの引数に渡して実行する事が出来ます。
下記の内容はカレントディレクトリ以下のファイル一覧をパイプラインを使用して出力を「xargsコマンド」に渡し、受け取った値を別のコマンドに引数として渡し実行している。
$ find . | xargs コマンド
例えば先ほどの「-exec」オプション検索結果に対して別コマンド実行の時と同じようにカレントディレクトリ以下の「html」ファイルのパーミッションを変更しようと「xargsコマンド」では下記のようにする。
$ find . -name "*.html" -type f | xargs chmod 600
「-exec」と「xargs」はどちらも結果に対してさらにコマンドを実行する事ができますが、「xargsコマンド」だと内部的ですが、複数行をまとめて渡してくれている。
感想
今回紹介した「findコマンド」は単体でも十分便利ですが、他のコマンドと組み合わせる事によって本当に使い勝手が良くなるので凄くオススメです。
近いうちに実際に作業していてよく使う便利コマンドの記事なんか書きたいと思いますので、よければまた見に来てくださいね。
その時はまた便利な「findコマンド」の組み合わせなんかも一緒に紹介できたらと思います。
About / ブログについて

D.M.C.【デベメモドットコム】はWEB制作に関することを中心に、
その他、関連する事まで出来るだけわかりやすく備忘録としてメモを残していくブログです。
このブログを通して少しでも為になる情報を発信して皆さんと共有できればとても嬉しいです。