Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxのfindコマンドでファイルを検索する方法【実用的な例付き完全ガイド】

Linuxシェルのfindコマンドを使うと、ファイルシステム上のファイルを柔軟に検索できます。ファイル名、所有者、パーミッション、サイズなど、さまざまな条件でファイルを見つけられるだけでなく、見つかったファイルに対してアクション(削除・コマンド実行など)を行うことも可能です。

findコマンドの基本構文

findコマンドの構文は以下のとおりです。

find [OPTIONS] [PATH] [EXPRESSION]

各要素の意味は次のとおりです。

  • [OPTIONS]:findの動作を決めるオプション(後述の表を参照)
  • [PATH]:検索を開始するパス
  • [EXPRESSION]:一致するファイルを判定するテスト条件と、見つかったファイルに対して実行するアクションを定義します

主なオプション(OPTIONS)

findコマンドでよく使われるオプションは以下のとおりです(マニュアルより抜粋)。

オプション 説明
-P シンボリックリンクを辿らない(デフォルトの動作)
-L シンボリックリンクを辿る。ファイルの情報を調べたり表示したりする際、リンクそのものではなく、リンク先のファイルの属性情報が使われます
-H コマンドライン引数の処理中を除き、シンボリックリンクを辿りません

式(EXPRESSION)の使い方

EXPRESSIONは「テスト(検索条件)」と「アクション」から構成されます。よく使われるものを以下にまとめます。

テスト(検索条件)

テスト 説明
-empty 空のファイルを検索
-executable 実行可能なファイル、および検索可能なディレクトリに一致
-group name nameというグループに属するファイル
-mtime n データがn×24時間前ちょうど、それより前、またはそれ以降に更新されたファイル
-name pattern ファイル名(ディレクトリ部分を除いたベース名)がパターンpatternに一致
-path pattern ファイルパス全体がパターンpatternに一致
-readable 現在のユーザーが読み取り可能なファイルに一致
-size n ファイルサイズがn単位ちょうど、未満、または超過(利用可能な単位は後述の表参照)
-type c ファイルタイプがc(値の一覧は後述の表参照)
-user name nameというユーザーが所有するファイル

アクション

アクション 説明
-print ファイル名を出力する(デフォルトのアクション)
-prune 対象がディレクトリの場合、その中へ降りない
-depth ディレクトリ自体よりも先に、その中身を処理する
-delete 一致したファイルを削除する(-depthを暗黙的に含むため、オプションとしても機能します)
-exec command commandを実行する
-execdir command -execと同様だが、一致したファイルがあるサブディレクトリからコマンドを実行する
-ok command -execと同様だが、実行前にユーザーに確認を求める
-okdir command -execdirと同様だが、-okと同じように実行前に確認を求める
-printf format 指定したformatでファイルの詳細情報を出力する

式の中で使える演算子

演算子を使うと、複数の条件を組み合わせられます。

演算子 説明
-o OR(いずれかの条件に一致)
-a AND(すべての条件に一致。演算子を省略した場合のデフォルト)

ファイル検索に使えるオプションや式の完全な一覧は、次のコマンドで確認できます。

man find

findコマンドの実用例

オプション・式・アクションを組み合わせることで、「一致するファイルを一覧表示する」という簡単な操作から、「複雑な条件でファイルを見つけて何らかの処理を行う」という高度な操作まで実現できます。以下に代表的な例を紹介します。

ファイル名で検索する

この例では、/home/screwディレクトリ内にあるmyfileという名前のファイルをすべて検索します。

find /home/screw -name myfile

ファイルタイプで絞り込む

上記のコマンドは、ディレクトリやシンボリックリンク、デバイスファイルなども含めて、ファイルシステム上のすべての一致対象を返します。

-type fという式を追加すると、検索対象を通常ファイルのみに絞り込めます。

find /home/screw -type f -name myfile

逆に、ディレクトリだけを検索したい場合は次のようにします。

find /home/screw -type d -name myfile

-typeで指定できるタイプの一覧は以下のとおりです。

タイプ 説明
b ブロック型(バッファリングあり)特殊ファイル
c キャラクタ型(バッファリングなし)特殊ファイル
d ディレクトリ
p 名前付きパイプ(FIFO)
f 通常ファイル
l シンボリックリンク(-Lオプションや-followオプション有効時には、リンクが壊れている場合を除いて真になりません)
s ソケット

大文字・小文字の区別

-nameは大文字・小文字を区別します。区別せずに検索したい場合は-inameを使います。

find /home/screw -iname mYFiLe

ワイルドカードと正規表現で拡張子を指定して検索する

ファイル名にはワイルドカード(*)が使えるため、拡張子を指定した検索も可能です。

find -L /home/screw -name '*.pdf'

上記の例では、.pdfという拡張子を持つファイルをすべて検索します。引用符で囲んだパターンには正規表現も含められます。

特定の名前や拡張子を除外して検索する

-not演算子を使うと、指定した名前やパターンに一致しないファイルだけを結果として取得できます。

find /home/screw -type f -not -name '*.pdf'

特定のディレクトリを丸ごと除外する

-pruneオプションを使うと、一致したパスとその中身を検索結果から除外できます。次の例では、/home/screw/junkディレクトリを結果から除外しています。

find /home/screw -path /home/screw/junk -prune -o -print

ファイルサイズで検索する

500KB未満のファイルをすべて検索する例です。

find /home/screw -type f -size -500k

サイズ条件を2つ渡すことで、100KB〜200KBの範囲にあるファイルを検索することもできます。

find /home/screw -type f -size +100k -size -200k

サイズ検索で使える単位は以下のとおりです。

単位 説明
b 512バイトブロック(接尾辞を省略した場合のデフォルト)
c バイト
w 2バイトワード
k キビバイト(KiB、1024バイト単位)
M メビバイト(MiB、1024×1024=1,048,576バイト単位)
G ギビバイト(GiB、1024×1024×1024=1,073,741,824バイト単位)

更新日時・アクセス日時で検索する

次の例では、過去14日以内に更新された.txtファイルをすべて検索します。

find /home/screw -name '*.txt' -mtime 14

更新日時ではなく最終アクセス日時で検索したい場合は、-mtimeの代わりに-atimeを使います。

数値に+-の符号を付けると、「指定した期間より前」「指定した期間以内」といった範囲指定が可能です。次の例では、14日より前に更新されたファイルを返します。

find /home/screw -name '*.txt' -mtime +14

日数の代わりに分単位で指定したい場合は、-mtime-atimeの代わりに-mmin-aminを使います。

その他にも組み合わせられるオプションは多数あります。詳細はマニュアルで確認してください。

man find

所有者ユーザー/グループで検索する

/home/screwディレクトリ内で、rootが所有するファイルをすべて検索する例です。

find /home/screw -user root

パーミッションで検索する

次のコマンドは、全ユーザーに対して読み書き権限のあるファイルを検索します。

find /home/screw -perm 777

パーミッションの詳細については、chmodコマンドに関する記事も参考にしてください。

複数条件の組み合わせ

検索式は自由に組み合わせられます。演算子を明示しない場合、すべての条件を満たす必要がある(ANDがデフォルト)と解釈されます。

次の例では、「過去14日以内に作成された500KB未満のテキストファイル」を検索しています。

find /home/screw -name '*.txt' -mtime 14 -type f -size -500k

見つかったファイルへのアクション

デフォルトでは、findコマンドは検索結果を表示します(-printアクションを呼び出した場合と同じ動作です)。

find /home/screw -name myfile -print

出力形式をカスタマイズする

-printfを使うと、見つかったファイルに関する追加情報を含めた出力が可能です。次の例では、「ファイル名 - ファイルサイズ(バイト)」の形式で表示しています。

find /home/screw -name '*.txt' -printf '%f - %s bytes'

ファイルサイズはもちろん、更新日時やアクセス日時などの個別の日付フィールドまで、多数の変数が出力に使えます。完全な一覧はマニュアルを参照してください。

検索結果をファイルに保存する

リダイレクトを使えば、findの結果をテキストファイルに保存できます。

find /home/screw -name myfile > find_results.txt

ファイルを削除する

-deleteアクションを使うと、一致したファイルを削除できます。確認なしで削除されるため、十分注意してください。

find /home/screw -name '*.junk' -delete

-exec / -execdirでコマンドを実行する

-execアクションを使うと、検索結果1件ごとに任意のシェルコマンドを実行できます。

find /home/screw -name '*.txt' -exec ls -la {} ';' 

-execは現在の作業ディレクトリからコマンドを実行します。見つかったファイルの場所でコマンドを実行したい場合は、代わりに-execdirを使います。

find /home/screw -name '*.txt' -execdir ls -la {} ';'

上記2つの例では、各検索結果に対してls -laが実行されます。波括弧{}はfindの検索結果に置き換えられ、';'はlsコマンドへの引数の終わりを示すためのもので、ここでコマンドが完了したことをfindに伝えます。

-ok / -okdirで実行前に確認を求める

-okアクションは-execと同じ動作をしますが、コマンド実行前にユーザーに確認を求めます。ファイルを削除したいけれど、1件ずつ確認してから削除したい場合などに便利です。

find /home/screw -name '*.txt' -ok rm {} ';'

-okdirも同様に確認を求めますが、見つかったファイルの場所からコマンドを実行します。

find /home/screw -name '*.txt' -okdir rm {} ';'
  1. Linuxで覚えておきたい10個のコマンド連結演算子と実用例

    Linuxにおける「コマンドの連結(チェーン)」とは、複数のコマンドを1行にまとめ、その間に挟んだ演算子の働きに応じて実行を制御するテクニックです。シェル上で小さなスクリプトを書くのに近い感覚で、ターミナルから直接手軽に実行できます。定型作業の自動化はもちろん、無人で稼働するサーバーをより体系的かつ安定して動作させるうえでも非常に有効です。あわせて読みたい: Awkと正規表現を使ってファイル内のテキストを抽出・フィルタリングする方法本記事では、日常的によく使われるコマンド連結演算子を10個厳選し、簡潔な説明と実際の実行例とともに解説します。これらを使いこなせるようになれば、短くて意味のあるコマ

  2. Linuxのlsコマンド徹底解説!ファイルとディレクトリを一覧表示する方法

    Linuxのlsコマンドは、多くのユーザーが最初に使うことになる基本コマンドの一つです。この記事では、lsコマンドの基本的な使い方と、実務で頻繁に利用されるオプションについてわかりやすく解説します。 筆者が普段よく使うオプションの組み合わせは以下のとおりです。 ls -Zaltrh それでは、各オプションの意味をひとつずつ掘り下げながら、この組み合わせがなぜ便利なのかを説明していきます。 lsコマンドの基本構文 # ls [OPTION] [FILE] OPTIONS: [-a] 「.」または「..」で始まる隠しエントリを無視しない [-h] -lと併用した場合、サイズを人間が読みやすい形式で