Linuxのコマンドの中で、ファイルの検索に使用できるのが findコマンドです。
findは、効率的に作業を行う上で重要なコマンドとなります。
今回の記事では、findコマンドの使い方について解説していきます。
Linuxのfindコマンドとは
findコマンドとは、特定のファイルやディレクトリ(フォルダ)を検索したいときに利用されるLinuxコマンドです。
名前、サイズ、更新日時など、任意の条件に基づくファイルやディレクトリをまとめて検索することができます。
また、検索結果をコンソールに表示するだけでなく、見つかったファイルに対して削除、コピー、権限変更などの一括処理を実行することも可能です。
ファイル名や条件を指定して検索する基本操作
まずは、基本的な操作から確認していきましょう。
findコマンドの構文は、以下の通りです。
$ find [コマンドラインオプション] [検索パス] [検索条件]もっとも基本的な使い方は、以下のように検索パスと検索条件を指定して検索することです。
$ find . -name "*.txt"検索パスには、検索を開始するツリー元となる場所を指定します。
GNU版の場合は検索パスが省略可能で、その場合はカレントディレクトリが検索開始場所となります。
ただし、他のOSでは省略できないため、基本的には明示的に記述することをおすすめします。
検索条件には、名前やサイズなどの条件の種類を示すオプションと、ファイルを絞り込むための条件を指定します。
上記の例の場合、「-name」 がオプション、「”*.txt”」 が絞り込み条件となります。
コマンドラインオプション (-H、-L、-P オプション) は、シンボリックリンクの扱いを指定するためのオプションです。
省略可能で、デフォルトでは -Pオプションの振る舞いをします。
ファイル名で検索する-nameオプションの使い方
ファイル名やディレクトリ名で検索したい場合は、-name を使用します。
検索する名前には、* や ? などのワイルドカードを指定することができます。
$ find ~/desktop -name "*.jpg"/Users/User/desktop/sample1.jpg
/Users/User/desktop/sample2.jpgファイルの種類(-type)とサイズ(-size)による絞り込み
-type を使用すると、ファイルの種類で対象を絞り込むことができます。
指定できる種類は以下の通りです。
- f (通常ファイル)
- d (ディレクトリ)
- l (シンボリックリンクファイル)
- b (ブロックデバイス)
- c (キャラクタデバイス)
- p (FIFOパイプ)
- s (ソケット)
find ~/desktop -type d/Users/User/desktop/sampleDic1
/Users/User/desktop/sampleDic2-sizeを使用すると、ファイル容量を基準に検索できます。
指定時の正負記号の有無によって、絞り込み対象となる容量の範囲が変化します。
- 記号なしの場合 … 指定のサイズ丁度のファイル
- 正の記号の場合 … 指定のサイズより大きいファイル
- 負の記号の場合 … 指定のサイズ未満のファイル
また、容量の単位には以下が指定可能です。
- b … ブロック(512バイト)単位
- c … 1バイト単位
- w … 2バイト単位
- k … キロバイト単位
- M … メガバイト単位
- G … ギガバイト単位
$ find . -size 1k # 1キロバイト丁度のファイル
$ find . -size +1k # 1キロバイトより大きいファイル
$ find . -size -1k # 1キロバイト未満のファイルフィルタリングを駆使して検索効率を上げる
findコマンドでは、上記以外にも様々な検索条件が指定可能です。
また、複数の条件を組み合わせて絞り込むことで、より効率的にファイルやディレクトリを検索することができます。
これらの検索方法についても見ていきましょう。
更新日時(-mtime)を指定して古いファイルを特定する
-mtime を使用すると、ファイルの更新日時を基準に検索ができます。
指定時の正負記号の有無によって、絞り込み対象となる期間が変化します。
- 記号なしの場合 … 現在時刻より⚪︎日前丁度のファイル
- 正の記号の場合 … 現在時刻より⚪︎日前を超えるファイル
- 負の記号の場合 … 現在時刻より⚪︎日未満のファイル
$ find ~/desktop -mtime 3 # 3日前丁度に更新されたファイル
$ find ~/desktop -mtime +3 # 3日より前に更新されたファイル
$ find ~/desktop -mtime -3 # 3日未満に更新されたファイル更新日時の他に、変更日時や参照日時などで検索することも可能です。
- mtime … 最終更新日時
- -ctime … 最終変更日時
- -atime … 最終参照日時
$ find ~/desktop -mtime 3 # 3日前に更新されたファイル
$ find ~/desktop -ctime 3 # 3日前に変更されたファイル
$ find ~/desktop -atime 3 # 3日前に参照されたファイル-mmin, -cmin, -amin を使用すると、日数ではなく分単位で指定できます。
$ find ~/desktop -mmin 10 # 10分前に更新されたファイル
$ find ~/desktop -cmin 10 # 10分前に変更されたファイル
$ find ~/desktop -amin 10 # 10分前に参照されたファイル権限(-perm)や論理演算を組み合わせた複数条件検索
-permを使用すると、指定の権限に一致するファイルやディレクトリを検索できます。
指定時に – または / を付けた場合、該当する権限を最低限満たすファイルが全てマッチします。
例えば以下の場合、755 など 644 の権限を含むものであれば、条件に一致すると見なされます。
$ find . -perm -644
$ find . -perm /644 # -644と同じ記号を付けない場合は、権限が完全に一致するもののみが検索対象となります。
また、検索条件は複数指定することも可能です。
指定時には、-and、-or、-not を使用して論理演算を行います。
$ find ~/desktop -name "*.jpg" -or -name “*.png”それぞれ -a、-o、! で省略可能ですが、! はメタ文字のため ¥ でエスケープする必要があります。
記述自体を省略した場合は -andで処理されます。
-execオプションを活用し検索結果を自動処理する
findコマンドの実行時に -execオプションを使用することにより、条件に一致したファイルに対して任意のコマンドが実行できます。
実際の使い方について見ていきましょう。
-execオプションによる一括操作の手順
-exec を使用する際は、以下の形式で記述します。
$ find [検索パス] [検索条件] -exec [実行コマンド] {} ¥;{} は検索結果のファイル名、¥; はコマンドの終了を意味します。
例えば以下の例は、条件に一致したファイルを1つずつ削除するコマンドとなります。
$ find ~/desktop -name "*.jpg" -exec rm {} ¥;¥; の部分を + にすると、複数ファイルをまとめて渡します。
実行回数が減るため、高速に処理することができます。
$ find ~/desktop -name "*.jpg" -exec rm {} +大量ファイル処理を最適化するxargsとの使い分け
同じような処理を行う別の方法として、xargs にパイプで渡す方法があります。
大量ファイルを処理する場合に、「-exec {} +」 を使用する方法 ( 「-exec {} ¥;」 ではないので注意 )と上記の方法で処理速度にはそこまで違いはありませんが、以下の点でそれぞれ動作が異なります。
- ファイル名にスペースや改行やクォートが入ってる場合に、xargsは誤作動を起こす
- xargsでの処理方法が使えない場合がある (POSIX 準拠のシェルスクリプト)
- find 以外のコマンドと組み合わせる場合は 「-exec {} + 」 は使えない
基本的には、「-exec {} + 」を使用する方法が安全に処理できますが、他のコマンドと組み合わせる場合は xargs を使用する必要があります。
使用状況に合わせて使い分けをしましょう。
まとめ
使用するオプションによって、ファイル検索を柔軟に実行できるのが findコマンドの強みです。
実際に活用しながら、よく使用するオプションは覚えておくと便利です。
Linuxの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Linuxに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。