Skip to content

find#

find コマンドは、UNIXおよびLinuxシステムにおいて、指定した条件に基づいてファイルやディレクトリを検索するためのツールです。 非常に強力で柔軟性が高く、多くのオプションやテストを用いて目的のファイルやディレクトリを検索することができます。

基本的な使用方法は以下の通りです:

find [検索の開始ディレクトリ] [オプションやテスト] [アクション]

ここで、いくつかの基本的なオプションと使用例を示します:

  1. 名前で検索

    find /path/to/start -name "filename"
    

  2. 変更されてから3日以内のファイルを検索

    find /path/to/start -mtime -3
    

  3. 500KBより大きいファイルを検索

    find /path/to/start -size +500k
    

  4. typeオプションを使用してディレクトリだけを検索

    find /path/to/start -type d
    

  5. typeオプションを使用してファイルだけを検索

    find /path/to/start -type f
    

  6. find で見つけたファイルを別のコマンド(例えば rm)と組み合わせて使用

    find /path/to/start -name "*.tmp" -exec rm {} \;
    

上記は find コマンドの非常に基本的な使用法の一部に過ぎません。find は多くのオプションやテストを持っているので、 マニュアルページ(man find)を参照して詳細な情報や例を確認することをおすすめします。

オプション#

find コマンドは、UNIXやLinuxのファイルシステムでファイルやディレクトリを検索するためのコマンドです。 多くのオプションがあり、非常に強力なコマンドとして知られています。

以下は find コマンドの主なオプションの一部です:

  1. 名前とパスに関するオプション:

    • -name パターン : ファイル名がパターンに一致するファイルを検索します。
    • -iname パターン : 大文字・小文字を区別せずに -name と同様に検索します。
    • -path パターン : パスがパターンに一致するものを検索します。
    • -ipath パターン : 大文字・小文字を区別せずに -path と同様に検索します。
  2. タイプオプション:

    • -type f : 通常のファイルを検索します。
    • -type d : ディレクトリを検索します。
    • -type l : シンボリックリンクを検索します。
  3. タイムスタンプに関するオプション:

    • -atime n : n日前にアクセスされたファイルを検索します。
    • -mtime n : n日前に変更されたファイルを検索します。
    • -ctime n : n日前にファイルのステータスが変更されたファイルを検索します。
    • -amin n : n分前にアクセスされたファイルを検索します。
    • -mmin n : n分前に変更されたファイルを検索します。
    • -cmin n : n分前にファイルのステータスが変更されたファイルを検索します。
  4. サイズに関するオプション:

    • -size n : サイズが n のファイルを検索します。nの後にc, k, M, Gなどの単位をつけることで、バイト数、キロバイト、メガバイト、ギガバイトなどの単位でサイズを指定できます。
  5. アクションオプション:

    • -print : 検索結果のパスを表示します。
    • -exec コマンド {} \; : 検索結果の各ファイルに対してコマンドを実行します。
    • -delete : 検索結果のファイルを削除します。
  6. その他のオプション:

    • -maxdepth n : n レベル以下のディレクトリのみを検索します。
    • -mindepth n : n レベル以上のディレクトリを検索します。
    • -empty : 空のファイルやディレクトリを検索します。
    • -user ユーザー名 : 指定したユーザーが所有するファイルを検索します。
    • -group グループ名 : 指定したグループが所有するファイルを検索します。

recipe#

find コマンドは非常に強力で、さまざまな状況で役立つ使い方があります。以下は、find コマンドのいくつかの便利な使用例を示しています:

  1. 特定の拡張子のファイルを検索する

    find /path/to/start -type f -name "*.txt"
    

  2. 空のディレクトリやファイルを検索する

    find /path/to/start -empty
    

  3. 一定の深さのディレクトリだけを探索する

    find /path/to/start -maxdepth 2 -name "*.txt"
    

  4. 特定のユーザーが所有するファイルを検索する

    find /path/to/start -user username
    

  5. 特定のサイズより大きい(または小さい)ファイルを検索する

    # 2MB以上のファイルを検索
    find /path/to/start -size +2M
    
    # 2MB以下のファイルを検索
    find /path/to/start -size -2M
    

  6. 特定の日数より古い(または新しい)ファイルを検索する

    # 30日以上古いファイルを検索
    find /path/to/start -mtime +30
    
    # 30日以内のファイルを検索
    find /path/to/start -mtime -30
    

  7. 検索結果を xargs と組み合わせる

    # .bak 拡張子を持つファイルをすべて削除
    find /path/to/start -name "*.bak" | xargs rm
    

  8. 特定のパーミッションを持つファイルを検索する

    # 777 のパーミッションを持つファイルやディレクトリを検索
    find /path/to/start -perm 777
    

  9. -exec を使用して各ファイルにコマンドを実行する

    # 各 .txt ファイルの内容を表示
    find /path/to/start -name "*.txt" -exec cat {} \;
    

  10. アクセスされてから一定の日数が経過していないファイルを検索する

    # 10日以内にアクセスされたファイルを検索
    find /path/to/start -atime -10
    

  11. ファイル内に含まれる文字列を検索するコマンド find 検索対象のディレクトリ -name 検索対象のファイル -type f -print0 | xargs -0 grep 検索したい文字列

    # 例. /var/log配下のファイル内に「reload」が含まれているものを検索する
    $ find /var/log -type f -print0 | xargs -0 grep reload
    
    !!! INFO find -print0 | xargs -0 grep とすることで、空白文字が入ったファイル(例. hoge piyo.txt)も検索対象にできる。

これらは find コマンドの一部の使い方にすぎません。実際の状況やニーズに合わせて、さまざまなオプションやテストを組み合わせて使用することができます。

正規表現#

find コマンドで正規表現を使用する場合、-regex オプションや -iregex オプション(大文字・小文字を区別しないバージョン)を使用します。これにより、より複雑なパターンマッチングが可能になります。

ここに、find コマンドで正規表現を使用する方法の基本的な例をいくつか示します:

  1. 特定の拡張子(.txt または .md)のファイルを検索する

    find /path/to/start -type f -regex ".*\.\(txt\|md\)$"
    

  2. file という名前の後に 1 から 3 の数字が続くファイルを検索する

    find /path/to/start -type f -regex ".*file[1-3]$"
    

  3. 大文字・小文字を区別しないマッチング

    # .TXT または .txt のファイルを検索
    find /path/to/start -type f -iregex ".*\.txt$"
    

find の正規表現は全体のパスにマッチしなければならない点に注意してください。 例えば、-regex ".*file[1-3]$" の正規表現は、/path/to/start/some/directory/file2 にマッチしますが、 file2 のみにはマッチしません。

また、正規表現の種類(基本 vs 拡張)やエスケープが必要な特定の文字(例えば括弧)に関する挙動は、 使用しているシステムや find のバージョンによって異なる場合がありますので、 具体的な状況に応じてマニュアルページ(man find)を確認するとよいでしょう。

recipe#

ファイルの内容に基づいてファイルを検索する場合、grep コマンドが非常に便利です。 find コマンドと組み合わせることで、特定のディレクトリの中で内容に特定の文字列が含まれるファイルを検索することができます。

以下は、findgrep を組み合わせて、特定の文字列 "TARGET_STRING" を含むファイルを検索する基本的な方法です:

find /path/to/start -type f -exec grep -l "TARGET_STRING" {} +

説明:

  • /path/to/start: 検索を開始するディレクトリのパス。
  • -type f: ファイルのみを対象とする。
  • -exec: このオプションは、find によって見つかった各ファイルに対して指定したコマンドを実行します。
  • grep -l "TARGET_STRING": grep コマンドを使用して "TARGET_STRING" を含むファイルを検索します。-l オプションは、マッチする文字列を含むファイルの名前のみを表示します。
  • {}: find によって見つかったファイルへのプレースホルダー。
  • +: 複数のファイルをまとめて grep に渡すための記号。

このコマンドを実行すると、指定したディレクトリ以下のすべてのファイルの中で "TARGET_STRING" を含むファイルのパスが表示されます。

grep コマンドは、デフォルトで基本的な正規表現をサポートしています。 したがって、"TARGET_STRING" の代わりに任意の正規表現を直接使用することができます。

もし拡張正規表現を使用したい場合は、grep-E オプションを使用します。

以下は、基本的な正規表現と拡張正規表現を使用した例です:

  1. 基本的な正規表現を使用する場合
  2. "TARGET_STRING1" または "TARGET_STRING2" を含むファイルを検索:

    find /path/to/start -type f -exec grep -l "TARGET_STRING1\|TARGET_STRING2" {} +
    

  3. 拡張正規表現を使用する場合

  4. "TARGET_STRING1" または "TARGET_STRING2" を含むファイルを検索:

    find /path/to/start -type f -exec grep -El "TARGET_STRING1|TARGET_STRING2" {} +
    

  5. 数字3回続くパターン (例: 123, 456) を含むファイルを検索:

    find /path/to/start -type f -exec grep -El "[0-9]{3}" {} +
    

grep-E オプションは、拡張正規表現の使用を可能にします。このオプションを使用すると、括弧やパイプなどの特殊文字をエスケープする必要がなくなります。

注意: 正規表現の内容や形式は、具体的な目的やニーズに応じて変更する必要があります。 また、使用する正規表現には注意が必要です。正規表現が複雑になると、パフォーマンスの低下や意図しないマッチが発生する可能性があります。

文字列がふくまれていないファイルを検索#

特定の文字列が含まれていないファイルを検索するために、grep-v (inverse) オプションを使用できます。ただし、この方法だけでは完全な答えを得ることはできません。なぜなら、grep はマッチしない行を返すため、1つのマッチしない行があるだけでファイルが出力される可能性があるからです。

以下の手順で、特定の文字列を含まないファイルを検索できます:

  1. 文字列が含まれているファイルを検索します。
  2. そのリストを除外して、残りのファイルを検索します。

これを実現するコマンドは次のとおりです:

find /path/to/start -type f ! -exec grep -q "TARGET_STRING" {} \; -print

説明:

  • !: これは否定演算子で、続く条件が真でない場合に真を返します。
  • -exec grep -q "TARGET_STRING" {} \;: grep コマンドの -q オプションは、何も出力せずに終了します。これにより、grep はファイル内に "TARGET_STRING" が見つかった場合に真を返します。
  • -print: この条件は、前の ! -exec 条件が真の場合にのみ実行されるため、"TARGET_STRING" を含まないファイルのみが出力されます。

このコマンドは、/path/to/start ディレクトリ以下で "TARGET_STRING" を含まないすべてのファイルを表示します。