find#
find コマンドは、UNIXおよびLinuxシステムにおいて、指定した条件に基づいてファイルやディレクトリを検索するためのツールです。
非常に強力で柔軟性が高く、多くのオプションやテストを用いて目的のファイルやディレクトリを検索することができます。
基本的な使用方法は以下の通りです:
ここで、いくつかの基本的なオプションと使用例を示します:
-
名前で検索
-
変更されてから3日以内のファイルを検索
-
500KBより大きいファイルを検索
-
typeオプションを使用してディレクトリだけを検索
-
typeオプションを使用してファイルだけを検索
-
findで見つけたファイルを別のコマンド(例えばrm)と組み合わせて使用
上記は find コマンドの非常に基本的な使用法の一部に過ぎません。find は多くのオプションやテストを持っているので、
マニュアルページ(man find)を参照して詳細な情報や例を確認することをおすすめします。
オプション#
find コマンドは、UNIXやLinuxのファイルシステムでファイルやディレクトリを検索するためのコマンドです。
多くのオプションがあり、非常に強力なコマンドとして知られています。
以下は find コマンドの主なオプションの一部です:
-
名前とパスに関するオプション:
-name パターン: ファイル名がパターンに一致するファイルを検索します。-iname パターン: 大文字・小文字を区別せずに-nameと同様に検索します。-path パターン: パスがパターンに一致するものを検索します。-ipath パターン: 大文字・小文字を区別せずに-pathと同様に検索します。
-
タイプオプション:
-type f: 通常のファイルを検索します。-type d: ディレクトリを検索します。-type l: シンボリックリンクを検索します。
-
タイムスタンプに関するオプション:
-atime n: n日前にアクセスされたファイルを検索します。-mtime n: n日前に変更されたファイルを検索します。-ctime n: n日前にファイルのステータスが変更されたファイルを検索します。-amin n: n分前にアクセスされたファイルを検索します。-mmin n: n分前に変更されたファイルを検索します。-cmin n: n分前にファイルのステータスが変更されたファイルを検索します。
-
サイズに関するオプション:
-size n: サイズが n のファイルを検索します。nの後にc, k, M, Gなどの単位をつけることで、バイト数、キロバイト、メガバイト、ギガバイトなどの単位でサイズを指定できます。
-
アクションオプション:
-print: 検索結果のパスを表示します。-exec コマンド {} \;: 検索結果の各ファイルに対してコマンドを実行します。-delete: 検索結果のファイルを削除します。
-
その他のオプション:
-maxdepth n: n レベル以下のディレクトリのみを検索します。-mindepth n: n レベル以上のディレクトリを検索します。-empty: 空のファイルやディレクトリを検索します。-user ユーザー名: 指定したユーザーが所有するファイルを検索します。-group グループ名: 指定したグループが所有するファイルを検索します。
recipe#
find コマンドは非常に強力で、さまざまな状況で役立つ使い方があります。以下は、find コマンドのいくつかの便利な使用例を示しています:
-
特定の拡張子のファイルを検索する
-
空のディレクトリやファイルを検索する
-
一定の深さのディレクトリだけを探索する
-
特定のユーザーが所有するファイルを検索する
-
特定のサイズより大きい(または小さい)ファイルを検索する
-
特定の日数より古い(または新しい)ファイルを検索する
-
検索結果を
xargsと組み合わせる -
特定のパーミッションを持つファイルを検索する
-
-execを使用して各ファイルにコマンドを実行する -
アクセスされてから一定の日数が経過していないファイルを検索する
-
ファイル内に含まれる文字列を検索するコマンド find
!!! INFO検索対象のディレクトリ-name検索対象のファイル-type f -print0 | xargs -0 grep検索したい文字列find -print0 | xargs -0 grepとすることで、空白文字が入ったファイル(例. hoge piyo.txt)も検索対象にできる。
これらは find コマンドの一部の使い方にすぎません。実際の状況やニーズに合わせて、さまざまなオプションやテストを組み合わせて使用することができます。
正規表現#
find コマンドで正規表現を使用する場合、-regex オプションや -iregex オプション(大文字・小文字を区別しないバージョン)を使用します。これにより、より複雑なパターンマッチングが可能になります。
ここに、find コマンドで正規表現を使用する方法の基本的な例をいくつか示します:
-
特定の拡張子(.txt または .md)のファイルを検索する
-
fileという名前の後に 1 から 3 の数字が続くファイルを検索する -
大文字・小文字を区別しないマッチング
find の正規表現は全体のパスにマッチしなければならない点に注意してください。
例えば、-regex ".*file[1-3]$" の正規表現は、/path/to/start/some/directory/file2 にマッチしますが、
file2 のみにはマッチしません。
また、正規表現の種類(基本 vs 拡張)やエスケープが必要な特定の文字(例えば括弧)に関する挙動は、
使用しているシステムや find のバージョンによって異なる場合がありますので、
具体的な状況に応じてマニュアルページ(man find)を確認するとよいでしょう。
recipe#
ファイルの内容に基づいてファイルを検索する場合、grep コマンドが非常に便利です。
find コマンドと組み合わせることで、特定のディレクトリの中で内容に特定の文字列が含まれるファイルを検索することができます。
以下は、find と grep を組み合わせて、特定の文字列 "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 オプションを使用します。
以下は、基本的な正規表現と拡張正規表現を使用した例です:
- 基本的な正規表現を使用する場合
-
"TARGET_STRING1" または "TARGET_STRING2" を含むファイルを検索:
-
拡張正規表現を使用する場合
-
"TARGET_STRING1" または "TARGET_STRING2" を含むファイルを検索:
-
数字3回続くパターン (例: 123, 456) を含むファイルを検索:
grep の -E オプションは、拡張正規表現の使用を可能にします。このオプションを使用すると、括弧やパイプなどの特殊文字をエスケープする必要がなくなります。
注意: 正規表現の内容や形式は、具体的な目的やニーズに応じて変更する必要があります。 また、使用する正規表現には注意が必要です。正規表現が複雑になると、パフォーマンスの低下や意図しないマッチが発生する可能性があります。
文字列がふくまれていないファイルを検索#
特定の文字列が含まれていないファイルを検索するために、grep の -v (inverse) オプションを使用できます。ただし、この方法だけでは完全な答えを得ることはできません。なぜなら、grep はマッチしない行を返すため、1つのマッチしない行があるだけでファイルが出力される可能性があるからです。
以下の手順で、特定の文字列を含まないファイルを検索できます:
- 文字列が含まれているファイルを検索します。
- そのリストを除外して、残りのファイルを検索します。
これを実現するコマンドは次のとおりです:
説明:
!: これは否定演算子で、続く条件が真でない場合に真を返します。-exec grep -q "TARGET_STRING" {} \;:grepコマンドの-qオプションは、何も出力せずに終了します。これにより、grepはファイル内に "TARGET_STRING" が見つかった場合に真を返します。-print: この条件は、前の! -exec条件が真の場合にのみ実行されるため、"TARGET_STRING" を含まないファイルのみが出力されます。
このコマンドは、/path/to/start ディレクトリ以下で "TARGET_STRING" を含まないすべてのファイルを表示します。