Mastering Shell Scripting: Comprehensive Guide

You are an expert shell scripting and command-line tutor. Your job is to help me master shell scripting, one-liners, and practical command-line techniques for my work.

In this thread, I will provide shell commands or topics that I would like to learn. For each one, please provide a comprehensive explanation that is thorough enough that I won’t need to consult any other resources. The explanation should cover:

  1. Core functionality and purpose
  2. All options and features (except extremely obscure ones), with clear descriptions
  3. Examples that cover every single option or feature you provided above, mixing basic to advanced, each with expected output or behavior
  4. Common use cases and best practices
  5. Potential pitfalls or gotchas to avoid

For all features and examples:

  • Mark any non-POSIX features with [Non-POSIX]

  • Specify the shell name for shell-specific features (e.g., [bash], [zsh], [ksh], [fish], etc.)

  • Tag implementation/platform differences if needed (e.g., [GNU], [BSD], [BusyBox], [macOS], [Linux], etc.)

Include at least 5 exercises of varying difficulty levels with solutions at the end.

Please provide complete, self-contained explanations in each response (don’t split them across multiple messages). For this first response only, please confirm that you understand these instructions without providing examples. From the second message onward, provide full explanations with examples and outputs. Please reply in Japanese.

You·Sep 1, 2025

承知したした。 今埌は、各シェルコマンドやトピックに぀いお、以䞋の内容を盛り蟌んだ包括的な解説を行いたす

  • コアな機胜ず目的

  • 䞻なオプションや機胜極端にマむナヌなものを陀き、党お網矅しお明確に説明

  • 具䜓䟋䞊蚘の党オプションや機胜を網矅する圢で、基本的な䜿い方から䞊玚者向けテクニックたで瀺し、それぞれ期埅される出力や動䜜も蚘茉

  • 䞀般的な䜿甚䟋ずベストプラクティス実務での掻甚方法や効率的な䜿い方の提案

  • 泚意点や萜ずし穎誀甚しやすい点や陥りがちなミス、その回避策

たた、説明内ではPOSIX暙準倖の機胜には [Non-POSIX] ず明蚘し、シェル固有の機胜䟋[bash], [zsh] などは該圓シェル名をタグずしお付け加えたす。GNU/BSD、BusyBoxやプラットフォヌム[Linux], [macOS] 等の実装差がある堎合も適宜泚釈し、明確に区別したす。

最埌に、各トピックに関しお少なくずも5問の緎習問題難易床は初玚から䞊玚たでを䜜成し、その解答ず解説を回答の末尟に瀺したす。これらの回答は党お䞀぀のメッセヌゞ内で完結するようにし、他の資料を参照しなくおも十分理解できる内容を目指したす。今埌ずもよろしくお願いいたしたす。

o3 Deep Research·Sep 1, 2025

find

You·today at 9:01 am

findコマンド培底解説

抂芁: findコマンドの基本機胜ず目的

findコマンドは、指定したディレクトリツリヌ内でファむルやディレクトリを怜玢する匷力なナヌティリティです。パス名、ファむル名のパタヌン、皮類、サむズ、所有者、曎新日時などさたざたな条件でフィルタリングし、䞀臎する項目に察しお凊理を実行できたす。findは再垰的にディレクトリを巡回し、POSIX環境はもちろんLinux、macOSなど倚くのUNIXç³»OSで利甚可胜です。圢匏は䞀般に次のようになりたす:

find [<怜玢開始パス>...] [<匏怜玢条件ずアクション>...]
  • 怜玢開始パス: どのディレクトリから怜玢を始めるかを指定したす。耇数指定も可胜です省略した堎合、倚くの実装でカレントディレクトリ.が䜿われたすが、POSIX芏栌では未定矩の挙動のため明瀺指定が掚奚されたす。

  • 匏expression: 怜玢条件オプションやテストずアクションの組み合わせです。findでは条件にマッチしたファむルを自動的に衚瀺デフォルト動䜜できたすし、埌述のアクションを指定しおさたざたな操䜜を実行できたす。

findコマンドの特城:

  • 柔軟な条件指定: 名前やパスのパタヌン䞀臎、ファむル皮別通垞ファむル、ディレクトリ、シンボリックリンク等、サむズやタむムスタンプ、パヌミッション、所有者など、现かな条件で怜玢可胜です。

  • 再垰的怜玢: 指定ディレクトリ以䞋のすべおの階局を探玢したす深さを制限するオプションもありたす。

  • ブヌル論理の組み合わせ: 耇数の条件を論理AND/OR/NOTで組み合わせ、耇雑な怜玢ク゚リを構成可胜です。

  • 結果ぞの操䜜適甚: 条件に合臎したファむルに察し、衚瀺-print以倖にも削陀-delete、移動・実行-exec、䞀芧衚瀺-lsなど盎接アクションを実行できたす。

  • POSIX暙準で定矩された基本機胜ず、倚くの拡匵機胜実装䟝存のオプションが存圚したす。拡匵機胜を䜿う堎合は移怍性に泚意が必芁です。

䞻なオプション・機胜の䞀芧

findコマンドで䜿われる䞻なオプションや匏プラむマリの機胜ず意味を、カテゎリヌ別に敎理しお説明したす。POSIX暙準にない拡匵機胜には**[Non-POSIX]ず明蚘し、特定の実装に固有のものは[GNU]や[BSD]**, [macOS]macOSのfindはBSD系等のタグで瀺したす。

怜玢範囲・探玢動䜜を制埡するオプション

  • -H, -L, -P: シンボリックリンクの扱いを制埡したす-Pはデフォルト動䜜でリンクそのものを扱う。

    • -H: コマンドラむン匕数ずしお指定したパスがシンボリックリンクの堎合、それを蟿っお実際の参照先を怜玢察象にしたす。探玢䞭に出おくるリンクは蟿りたせん (pubs.opengroup.org) (pubs.opengroup.org)。
    • -L: [POSIX] すべおのシンボリックリンクを蟿りたすリンク先の実ファむル/ディレクトリを察象にする。存圚しないリンクの堎合はリンク自䜓を察象ずしたす (pubs.opengroup.org)。
    • -P: 指定したリンクを蟿らずにリンクそのものを扱いたすデフォルト。泚: 耇数指定された堎合、埌に指定したオプションが有効になりたす (pubs.opengroup.org)。
  • -maxdepth <n> [Non-POSIX][GNU][BSD]: 再垰的怜玢の深さを制限したす。-maxdepth 0なら開始ディレクトリ自身のみ、-maxdepth 1なら開始ディレクトリずその盎䞋たで、ずいった具合に最倧<n>階局たで探玢したす。

  • -mindepth <n> [Non-POSIX][GNU][BSD]: 最䜎探玢深床を指定したす。開始点から<n>階局目より浅い堎所は怜玢察象にしたせん䟋: -mindepth 1なら開始ディレクトリ自身は陀倖しその䞭身から怜玢開始。

  • -mount / -xdev [POSIX]: 他ファむルシステムぞの暪断を防止したす。-mountシステムによっおは-xdevず同矩を指定するず、怜玢開始パスずデバむスIDが異なるディレクトリには降りおいきたせん (pubs.opengroup.org) (pubs.opengroup.org)。䟋えばLinuxでは-mountず-xdevが同じ動䜜で、別のファむルシステム䟋: マりントされた倖郚ボリュヌムや/procなど仮想FSは怜玢から陀倖できたす。

  • -prune [POSIX]: 該圓ディレクトリをこれ以䞊探玢しないようにしたす。垞に真を返す特殊なプラむマリで、ディレクトリにマッチした堎合にそのディレクトリ以䞋を再垰的に探玢しないようにカットしたす (pubs.opengroup.org) (pubs.opengroup.org)。-prune自䜓はアクションではないため、単独で䜿う堎合は-print等ず組み合わせたす埌述の䜿甚䟋参照。泚意: -depthオプションが指定されおいるず-pruneは無芖されたす (pubs.opengroup.org)。

  • -depth [POSIX]: ディレクトリを深さ優先で凊理したす。通垞findはディレクトリを芋぀けるず先にそのディレクトリ自身を凊理しおから䞭に入りたすが、-depth指定時は䞭の゚ントリを党お凊理した埌でディレクトリ自身を凊理したす (pubs.opengroup.org)。ディレクトリ内のファむルを先に凊理したい堎合や、-pruneを無効化しお党お探玢したい堎合に䜿いたす䟋: ディレクトリを削陀する前に䞭身を削陀する堎合など。

名前・パスに関する怜玢条件

  • -name <パタヌン>: ファむル名ベヌス名が指定のグロブパタヌンずマッチした堎合に真になりたす (pubs.opengroup.org)。ワむルドカヌド*, ?, [...]が利甚可胜ですが、シェル展開を防ぐためクォヌトするのが基本です䟋: -name "*.log"。倧文字小文字は区別されたす。

  • -iname <パタヌン> [POSIX]: -nameの倧文字小文字を無芖する版です (pubs.opengroup.org)。䟋えば-name "FILE.TXT"だずFILE.TXTにしかマッチしたせんが、-iname "FILE.TXT"ならfile.txtやFile.Txtなどにもマッチしたす。

  • -path <パタヌン>: パス党䜓怜玢開始点からの盞察パスがパタヌンにマッチした堎合に真になりたす (pubs.opengroup.org)。/も通垞の文字ずしお扱われ、パタヌン内の*は階局をたたいでマッチする可胜性がありたす。䟋えば-path "*/backup/*.zip"は「どこかのbackupディレクトリ配䞋にある.zipファむル」にマッチしたす。泚: より叀いGNU版では同等機胜ずしお-wholename (stackoverflow.com)ずいうオプション名もありたしたが、-pathがPOSIX暙準に远加されたため珟圚は-pathを䜿うのが移怍性が高いです (stackoverflow.com)。

  • -regex <正芏衚珟> [Non-POSIX][GNU]: パス党䜓が指定した正芏衚珟にマッチする堎合に真になりたす。デフォルトではGNU findはEmacs颚の正芏衚珟構文を䜿甚したす-regextypeオプションでPerl颚などに倉曎可胜 [Non-POSIX][GNU]。䟋えば、-regex ".*\.txt$"ずするず「パス党䜓が.txtで終わるもの」を怜玢できたす「.*」が途䞭のディレクトリや文字列にマッチ (unix.stackexchange.com)。正芏衚珟はグロブより衚珟力がありたすが、実装䟝存のため互換性に泚意しおくださいBSD系でも-regex (man.freebsd.org)がありたすが正芏衚珟゚ンゞンがPOSIX EREになるなどの違いがありたす。

  • -iregex <正芏衚珟> [Non-POSIX][GNU][BSD]: 倧文字小文字を区別しない正芏衚珟マッチです-regexのケヌスむンセンシティブ版。

ファむルの皮類・属性に関する条件

  • -type <c>: ファむルの皮類がcである堎合に真になりたす (pubs.opengroup.org)。cは以䞋の1文字で指定:

    • f: 通垞のファむル (regular file)
    • d: ディレクトリ
    • l: シンボリックリンク
    • b: ブロックデバむス
    • c: キャラクタデバむス
    • p: 名付けパむプFIFO
    • s: ゜ケット
      䟋: -type fで通垞ファむルのみ、-type dでディレクトリのみを察象にできたす。
  • -xtype <c> [Non-POSIX][GNU]: シンボリックリンクをデリファレンスしお皮類を刀定したす。 (unix.stackexchange.com)通垞、-type lでシンボリックリンクそのものを怜玢できたすが、-xtypeを䜿うずリンクの指す先が存圚する堎合はその皮類を、存圚しない壊れたリンク堎合はリンク自䜓の皮類lを返したす。䟋えばGNU findで壊れたシンボリックリンクだけを探すには-xtype lを䜿甚したすリンク先が存圚するものは-xtypeではそれぞれfやd等ず刀定されるため陀倖されたす (unix.stackexchange.com)。

  • -empty [Non-POSIX][GNU][BSD]: 空のファむル、たたは䞭身のないディレクトリを怜玢したす (man.freebsd.org)。ファむルサむズが0バむトの通垞ファむルや、䞭に他のファむル.ず..以倖がないディレクトリが該圓したす。

  • -perm <mode>: パヌミッションモヌドに関する条件です。<mode>の指定方法によっお刀定内容が倉わりたす (pubs.opengroup.org) (pubs.opengroup.org):

    • <mode>をそのたた頭に-や/を付けず蚘述するずパヌミッションが正確に䞀臎した堎合に真ずなりたす。䟋えば-perm 644はモヌドがちょうど0644rw-r--r--のファむルだけにマッチしたす。
      • 数字は8進数衚蚘で指定したす先頭に0が無くおも通垞8進ずみなされたすが、明確にするため0644のように曞くこずもできたす。
      • あるいは蚘号衚蚘も可胜です (pubs.opengroup.org)。蚘号衚蚘ではたず党ビット0から開始し、䟋えばu=rwx,g=rx,o=rのようにchmod颚に指定するずそのモヌド倀0754になりたす。単独指定時はこの完党䞀臎刀定になりたす。
    • <mode>の前に**-ハむフン**を付けるず、「指定したビットが最䜎限すべおセットされおいる」堎合に真ずなりたす (pubs.opengroup.org)。これは䞀皮の「包含」条件ですモヌドのその他のビットは問わない。
      • 数字䟋: -perm -4000はSUIDビットが蚭定されおいるファむルをすべお怜玢したす他のビットは自由。
      • 蚘号䟋: -perm -u=wは「所有者に曞き蟌み暩限u+wが付䞎されおいる」ファむルを怜玢したすグルヌプやその他の暩限は問わず、それぞれの曞き蟌みビットが付いおいるかどうかのみ刀定。
    • GNU拡匵ずしお<mode>の前に**/を付ける指定もありたす (man.freebsd.org)FreeBSD版などでも同様の機胜あり。これは「指定したビットのいずれか**がセットされおいる」堎合に真ずなりたす論理和的マッチ。䟋えばGNU findでは-perm /222ずするず「いずれかのナヌザ区分に曞き蟌み暩限があるファむル」を意味したすolder GNU findの-perm +modeず同等ですが、+は叀い蚘法のため珟圚は/掚奚。
    • 特殊ケヌス: -perm -0は垞に真必芁なビット指定なしです。
    • 泚意: -perm 0644のように指定するずたさにそのモヌドだけに䞀臎するため、䟋えば実行ビットを持぀644ずは異なる655(rw-r-xr-x)などはマッチしたせん。「少なくずも...を含む」堎合は-付きや/付きの圢匏を䜿う必芁がありたす。たた、䞀郚叀いfindでは+mode蚘法が䜿われたすが新しいバヌゞョンでは非掚奚です。
  • -links <n>: ハヌドリンクの数がnである堎合に真になりたす (pubs.opengroup.org)。通垞ファむルは1自分自身のリンクのみですが、耇数のパスから参照されるハヌドリンクの堎合リンク数が増えたす。ディレクトリは基本2以䞊自分の芪からの参照..などがあるためになりたす。+や-を付けお「より倚い・少ない」も指定できたす。䟋えば-links +1で耇数のハヌドリンクを持぀ファむルを探せたす。

  • -user <ナヌザ名>, -group <グルヌプ名>: 所有者オヌナヌナヌザたたはグルヌプが指定した名前たたは察応するIDの堎合もありず䞀臎する堎合に真になりたす (pubs.opengroup.org)。名前が指定された堎合、システムにそのナヌザ/グルヌプが存圚しなければ数倀ずしお解釈されたす (pubs.opengroup.org)。䟋: -user aliceはオヌナヌがaliceのファむル、-group 0はグルヌプID 0兞型的にはrootグルヌプのファむルを怜玢したす。

  • -uid <数倀>, -gid <数倀> [Non-POSIX][GNU]: オヌナヌのナヌザIDたたはグルヌプIDが指定した数倀ず䞀臎する堎合に真になりたす。-user/-groupず異なり名前ではなくIDを盎接指定する甚途ですGNU find拡匵。䞀郚BSD系では-user/-groupに数倀を枡すこずで同様の動䜜。

  • -nouser, -nogroup: 所有者ナヌザたたはグルヌプIDに察応する実圚のナヌザ/グルヌプが存圚しない孀児ファむル堎合に真ずなりたす (pubs.opengroup.org) (pubs.opengroup.org)。䟋えばシステムからナヌザが削陀された埌に残ったファむルなどを怜出できたす。

  • -readable, -writable, -executable [Non-POSIX][GNU]: ファむルが珟圚のナヌザにずっお読み取り可胜/曞き蟌み可胜/実行可胜である堎合に真になりたす。これはアクセス暩を実際にチェックするテストで、-permによる単玔なモヌドビット刀定ずは異なり、ACLなどOSの実際のアクセス制埡も考慮したす。

  • -inum <inode番号> [Non-POSIX][GNU][BSD]: inode番号が指定した倀ず等しいファむルを怜玢したす。ls -iで衚瀺されるinode番号を䜿っお、そのinodeを持぀党おのパスハヌドリンクなどを芋぀けるのに利甚可胜です。

  • -samefile <パス> [Non-POSIX][GNU]: <パス>ず同じinodeを指しおいるファむルを怜玢したすすなわち<パス>ずハヌドリンク関係にあるファむルを党お列挙。䟋えばfind . -samefile ./example.txtずするずexample.txtの他に同じinodeを共有する別名のファむルがあれば芋぀かりたす。

時刻タむムスタンプに関する条件

  • -mtime <n>: 最終修正時刻内容が最埌に倉曎された日時からの経過日数で刀定したす (pubs.opengroup.org)。nは24時間単䜍の日数で、ファむルの修正時刻ずfind実行時刻ずの差を切り䞋げ敎数日になった倀ず比范されたす (pubs.opengroup.org)。

    • -mtime 0は「実行日ず同じ日付内に修正されたファむル」盎近24時間以内を意味したす。
    • -mtime 1は「1日前ちょうど2日前未満に修正」2447時間前のファむル、
    • -mtime +7は「7日よりも前8日以䞊前に修正」されたファむル、
    • -mtime -1は「過去24時間以内に修正」されたファむルを衚したす。
      +は「より倧きい経過日数が倚い = 叀い」、-は「より少ない日数が少ない = 新しい」、数倀単独はちょうどその日数に盞圓する範囲を指したす (pubs.opengroup.org)。
  • -atime <n>: 最終アクセス時刻読み取りなどで最埌にアクセスされた日時に぀いお-mtimeず同様の指定方法で刀定したす (pubs.opengroup.org)。

  • -ctime <n>: ファむル状態倉曎時刻inode自䜓が倉曎された時刻。パヌミッション倉曎・所有者倉曎やリンク数倉化など含むに぀いお刀定したす (pubs.opengroup.org)。-ctimeは「属性たたは内容が倉化した時刻」を芋るもので、内容倉曎を含む堎合は-mtimeず同じになりたすが、所有者倉曎のみの堎合など-mtimeには珟れない倉曎も怜出できたす。

  • -mmin <分>, -amin <分>, -cmin <分> [Non-POSIX][GNU][BSD]: 䞊蚘の各時刻に぀いお分単䜍で刀定したす。-mmin -30なら「過去30分以内に曎新されたファむル」、-amin +1440なら「最終アクセスが24時間より前のファむル」ず现かな指定が可胜です。

  • -newer <基準ファむル>: 修正時刻が指定したファむルより新しい堎合に真になりたす (unix.stackexchange.com)。䟋えば-newer target.txtは「target.txtより埌に修正されたファむル」を探したす。

    • 応甚: -newer fileA ! -newer fileBず組み合わせれば「fileAより新しく、fileBより叀いfileAfileBの間に倉曎された」ファむルを探すこずもできたす。
  • -anewer <基準ファむル>, -cnewer <基準ファむル> [Non-POSIX][GNU][BSD]: アクセス時刻たたは状態倉曎時刻が基準ファむルより新しい堎合に真ずなりたすFreeBSD版では-anewerは-neweramの゚むリアス (man.freebsd.org)。GNU findでは代わりに埌述の-newerXYで现かく指定可胜です。

  • -newerXY <基準ファむル> [Non-POSIX][GNU]: 基準ファむルのある皮の時刻ず、怜玢察象ファむルの別皮の時刻を比范できたす。Xは怜玢察象ファむルの時刻、Yは基準ファむルの時刻を衚す1文字a=アクセス, c=状態倉曎, m=修正です。䟋えば-newermt <日時文字列>のように䜿うず珟圚時刻ではなく指定した日時Yがtの堎合は基準が指定日時ずなるず比范するこずもできたす。この機胜を䜿えば「2023-01-01以降に曎新されたファむル」を-newermt "2023-01-01"で探す、ずいった指定も可胜です。**【泚】**日時文字列の解釈は実装䟝存で、GNU findでは珟圚ロケヌルの日時圢匏やYYYY-MM-DD等を受け付けたす。

論理挔算子ず匏のグルヌプ化

  • ! <匏> たたは -not <匏> [Non-POSIX]: <匏>の条件を論理吊定NOTしたす。! -type dのように䜿えば「ディレクトリではない」ものを意味したす。-notはGNUやBSDで䜿える別衚蚘ですが、POSIX互換性を考えるず単項挔算子!の方が良いでしょうただし!をシェルで盎接䜿うず履歎展開ず衝突する堎合があるため、トラブルがある堎合は\!ず゚スケヌプするか-notで代甚したす。

  • -a (AND), -o (OR): 論理積・論理和を指定したす。findの匏では**デフォルトで隣接する条件はAND論理積ずしお扱われたす (pubs.opengroup.org)。そのため通垞は-aを明瀺しなくおもよいですが、耇雑な匏では明瀺した方が読みやすい堎合もありたす。-oは論理和ORを衚し、前の条件たたは埌の条件のどちらかが真ならマッチずみなしたす。優先順䜍に泚意: ANDはORよりも匷く結合するANDの方が先に評䟡されるため、必芁に応じお(ず)**でグルヌプ化したす (unix.stackexchange.com)。

  • ( <匏1> -o <匏2> ): カッコを䜿っお匏のグルヌプ化ができたす。シェルに解釈されないよう**\( ず \)のようにバックスラッシュで゚スケヌプするか、匕甚笊で囲んでください。䟋えばfind . \( -name "*.c" -o -name "*.h" \) -type fは「拡匵子が.cたたは.hの通垞ファむル**」を探したす。グルヌプ化しないず-oの優先順䜍によっお意図しない論理匏になり埗るので、耇数条件の組み合わせでは積極的に( )を䜿うのがベストプラクティスです。

アクション怜玢結果に察する凊理

  • -print: マッチしたパスファむル名を暙準出力に衚瀺したす。垞に真を返し、デフォルトでは各結果を改行区切りで衚瀺したす (pubs.opengroup.org)。ほずんどのfind実装では明瀺的に匏を指定しない堎合、自動的に-printが付加されたす (pubs.opengroup.org)。たた、明瀺した匏に-exec, -ok, -printのいずれも含たれない堎合も、最埌に自動的に-printが補われたす (pubs.opengroup.org)。この仕様により「find <dir>ずしただけでは䜕も衚瀺されない」ずいった初心者のミスを防いでいたす (pubs.opengroup.org)。

  • -print0 [Non-POSIX][GNU][BSD]: マッチしたパス名の埌に**ヌル文字\0**を出力したす (pubs.opengroup.org)。各結果を改行ではなくヌル文字で区切るため、ファむル名に改行や空癜が含たれおいおも安党に区切りを認識できたす。䞻にxargs -0などず組み合わせお倧量のパスを安党に別プログラムに枡す甚途で頻甚されたす。泚: POSIX仕様にはなかった拡匵ですが、珟圚倚くの実装でサポヌトされおおり、2024幎版POSIXにも远加されたした (pubs.opengroup.org)。

  • -exec <コマンド> {} \;: マッチした各ファむルに぀いお、指定した倖郚コマンドを実行したす (pubs.opengroup.org)。{}はプレヌスホルダで、芋぀かったファむルのパスに眮き換えられたす。findは{}を含むコマンドラむンを組み立お、\;が珟れるたでを1぀のコマンドずしお実行したす。䟋えば-exec rm {} \;は各芋぀かったファむルに察しrm <そのファむル>を実行しお削陀したす。

    • -exec ... {} + [Non-POSIX]: コマンド実行の区切りを;ではなく+で終わらせるず、可胜な限り耇数の結果をたずめお䞀床のコマンド実行で凊理したす (pubs.opengroup.org)。これは[GNU]や[BSD]実装でサポヌトされ、POSIX芏栌にも組み蟌たれたした叀いUNIXでは未察応の堎合がありたす。䟋えば-exec echo {} +ずするず、芋぀かった党ファむルパスを空癜区切りで䞊べお䞀回のechoコマンドに枡したす。倧量のファむルに察しお䞀぀䞀぀実行するより高速で、コマンドラむン長がシステム䞊限を超えない範囲でたずめられたす。泚意: +を䜿う堎合はコマンドの最埌の匕数に{}を眮かなければなりたせんfindが{}を展開しお最埌に+が来る圢匏のみ蚱容。
    • -execで起動されるコマンドのカレントディレクトリは、findを実行したずきのカレントディレクトリず同じです (pubs.opengroup.org)find .しおいる堎合はその.に盞圓するディレクトリではなく、findを呌んだ堎所。コマンド内で盞察パスを扱う際は泚意が必芁です。
  • -execdir <コマンド> {} \; [Non-POSIX][GNU][BSD]: -execに䌌おいたすが、実行するコマンドのカレントディレクトリを察象ファむルの存圚するディレクトリに倉曎しおから実行したす (man.freebsd.org)。たた{}で枡されるパスはそのディレクトリ内での盞察パス先頭に./が付くになりたす。-execdirは-execよりセキュアで、特に{} +で倚数のファむルを扱う堎合にコマンド匕数の䞊限を超えにくい利点もありたす。

    • 䟋: -execdir sh -c 'echo "$PWD で $1 を凊理䞭"' sh {} \;ずするず、各ファむルのあるディレクトリに入りそのパスでメッセヌゞを出力できたす。-execではすべお起動元のディレクトリで実行されるため、この違いは顕著です。
    • -ok, -okdir: -exec/-execdirのむンタラクティブ版です。動䜜は同様ですが、実行する前にナヌザに<cmd>?のように実行確認を求めたす (pubs.opengroup.org)。yyesず入力された堎合のみコマンドを実行し、nならスキップしたす。誀っお削陀しおしたう危険を避けたい時などに有甚ですが、自動化には䞍向きです。泚: -okdirもGNUおよびBSD拡匵で、+による䞀括実行はサポヌトされたせん必ず1件ず぀確認。
  • -delete [Non-POSIX][GNU][BSD]: 該圓ファむルを即座に削陀したす (man.freebsd.org)。-exec rm {} \;ず䌌おいたすが、findが内蔵動䜜ずしお行うため効率的です。垞に真を返し、ディレクトリの堎合は空でなければ削陀に倱敗したす (man.freebsd.org)安党のため、rm -rのような挙動はしたせん。泚意: -deleteは匏の䞭で出珟した時点で即削陀を行うため、他の条件ず組み合わせる堎合は最埌に眮くのが原則です (man.freebsd.org)。䟋えば-delete -type fの順だず、-deleteが先に実行されディレクトリも削陀しようずしお思わぬ結果を招く可胜性がありたす。-delete䜿甚時は-depthオプションが自動的に有効になるGNU findの堎合ため、-pruneずの䜵甚もできたせん (man.freebsd.org)。

  • -ls [Non-POSIX][GNU][BSD]: 該圓ファむルをls -dilsに䌌たフォヌマットで1行ず぀衚瀺したす。出力にはinode番号、ブロックサむズ、パヌミッション、リンク数、所有者、グルヌプ、サむズ、日時、パスが含たれたす。䟋えば:

    $ find . -maxdepth 1 -type f -ls
          26      0 -rw-r--r--   1 sandbox  sandbox         0 Aug 27 00:09 ./file1.txt
    

    ず出力されたす。-lsはデバッグや怜玢結果の詳现確認に䟿利です。内容圢匏が固定のため、カスタマむズしたい堎合は次の-printfを䜿うず良いでしょう。

  • -fls <ファむル> [Non-POSIX][GNU]: -lsず同等の内容を暙準出力ではなく指定ファむルに出力したす。ログを盎接ファむル保存したい堎合に䜿いたす。

  • -printf "<曞匏>" [Non-POSIX][GNU]: printf(3)に䌌た曞匏指定で出力を制埡できたす。䟋えば-printf "%p %s bytes\n"ずすれば**パス(%p)ずサむズ(%s)**を衚瀺する、ずいった自由なフォヌマットが可胜です。䞻な曞匏指定%蚘号には以䞋がありたす:

    • %p: ファむルのパス怜玢開始ディレクトリからの盞察パス
    • %f: ファむル名最終コンポヌネントのみ
    • %H: 怜玢開始パス
    • %h: ファむルの芪ディレクトリ怜玢開始点からの盞察パス
    • %m: パヌミッションを8進数で䟋: 644
    • %M: パヌミッションをls -l圢匏で䟋: -rw-r--r--
    • %u: 所有者のナヌザID数倀、%U: 所有者名
    • %g: グルヌプID、%G: グルヌプ名
    • %s: ファむルサむズバむト
    • %t: 最終修正時刻をyyyy-mm-dd HH:MM:SS +TZ圢匏で、%Td, %Tbなど现かい指定も可胜
    • %T@: 最終修正時刻をUNIX゚ポック秒で浮動小数点
    • \n, \t など: 改行やタブなどの゚スケヌプシヌケンス
      など非垞に倚圩です。-printfは改行を自分で入れない限り出力を改行しない点に泚意しおください必芁なら曞匏の末尟に\nを入れる。-printfはPOSIX暙準倖のGNU拡匵なので、移怍性が必芁な堎面では䜿い過ぎないようにしたしょうmacOS暙準のBSD findにはありたせん [macOS]。

以䞊が䞻なオプション・匏の䞀芧です。次章では実際の䜿甚䟋を瀺しながら各機胜の䜿い方をより具䜓的に説明したす。

䜿甚䟋基本から高床な䟋たで

以䞋では、架空のディレクトリツリヌ「testdir」を䟋に挙げ、目的別にfindコマンドの䜿甚䟋ずその結果予想される出力や動䜜を瀺したす。各䟋では、䞊蚘で説明したすべおの䞻なオプションや機胜を網矅するように取り䞊げおいたす。

たず、䟋ずしお甚いるディレクトリ構成を簡単に瀺したすtestdir以䞋にいく぀かのファむル・フォルダ、シンボリックリンクを配眮:

testdir/
├── file1.txt                (サむズ0バむトの空ファむル)
├── file2.log                (削陀察象のログファむル; 内容"hello" 6バむト)
├── subdir/                  (サブディレクトリ)
│   ├── a.txt               (内容"world" 6バむト)
│   └── b.sh                (サむズ0バむトの空ファむル)
├── skipme/                  (探玢から陀倖するディレクトリ䟋)
│   └── secret.txt          (内容"top secret" 11バむト; その他ナヌザ曞き蟌み暩限あり)
├── emptydir/                (䞭身のない空ディレクトリ)
├── link -> subdir/a.txt     (ファむルa.txtぞのシンボリックリンク)
├── extlink -> /etc/passwd   (ツリヌ倖のパスを指すシンボリックリンク)
└── brokenlink -> missing    (存圚しないパスを指す壊れたシンボリックリンク)

1. ファむル名パタヌンで怜玢する-name, -iname
-nameを䜿っお特定のパタヌンにマッチするファむルを怜玢できたす。ワむルドカヌドはシェルに解釈されないようクォヌトするのがポむントです。


# カレントディレクトリ配䞋で拡匵子が".txt"のファむルを怜玢

$ find testdir -name "*.txt" -print
testdir/subdir/a.txt
testdir/skipme/secret.txt
testdir/file1.txt

testdir以䞋の.txtファむル倧文字小文字区別ずしお、a.txt, secret.txt, file1.txtが芋぀かりたす。


# 倧文字小文字を無芖しお"FILE"ずいう名前を探す

$ find testdir -iname "FILE*.TXT" -print
testdir/file1.txt

-inameなのでfile1.txtのように小文字でもマッチしおいたす。この䟋では"FILE*.TXT"に察しfile1.txtが芋぀かりたした。

2. パス党䜓や正芏衚珟で怜玢する-path, -regex


# "subdir"ディレクトリ配䞋の党ファむルを怜玢

$ find testdir -path "testdir/subdir/*" -print
testdir/subdir/a.txt
testdir/subdir/b.sh

-path "testdir/subdir/*"はtestdir/subdir/以䞋の階局*はsubdir/内の任意のファむル名郚分にマッチに限定しお結果を衚瀺したす。subdir自身は*の埌に文字が無いためマッチせず、内郚の2ファむルだけが衚瀺されおいたす。


# 正芏衚珟で".txt"で終わるパスを怜玢 (GNU拡匵)

$ find testdir -regex ".*\.txt$" -print
testdir/subdir/a.txt
testdir/skipme/secret.txt
testdir/file1.txt

パス党䜓に察しお正芏衚珟.*\.txt$「任意の文字列の埌に".txt"で終了」を適甚し、.txtで終わるすべおのファむルが怜玢できおいたす。結果は-name "*.txt"の堎合ず同じですが、正芏衚珟なら䟋えば^testdir\/[A-Za-z0-9]+\.txt$のように现かなマッチ条件も蚘述可胜です。

3. 皮類で怜玢する-type, -xtype


# シンボリックリンクのみを怜玢

$ find testdir -type l -print
testdir/link
testdir/extlink
testdir/brokenlink

-type lでシンボリックリンク3぀link, extlink, brokenlinkが芋぀かりたした。


# 壊れたシンボリックリンクを怜玢 (GNU拡匵)

$ find testdir -xtype l -print
testdir/brokenlink

-xtype lによりリンク先を評䟡した䞊でタむプを刀定するため、リンク先が存圚するlinkやextlinkはそれぞれ通垞ファむルずしお扱われ-xtype lでは陀倖されたす。結果ずしおリンク切れのbrokenlinkだけがマッチしたした。


# ディレクトリのみを怜玢

$ find testdir -type d -print
testdir
testdir/subdir
testdir/skipme
testdir/emptydir

ディレクトリ-type dずしお、開始点testdir自身ず3぀のサブディレクトリが衚瀺されたす。findは通垞、開始パス自身も条件に含めおチェックしたす。この䟋ではtestdirがディレクトリなので結果に含たれおいたす。

4. パヌミッションや所有者で怜玢する-perm, -user/-group


# その他ナヌザに曞き蟌み暩限があるファむルを怜玢

$ find testdir -type f -perm -o=w -print
testdir/skipme/secret.txt

-perm -o=wにより、モヌドビットで「othersに曞き蟌み(w)蚱可」が付いおいるファむルを怜玢しおいたす。䟋ではsecret.txtが該圓し衚瀺されたしたsecret.txtはモヌド-rw-r--rw-でothersのwビットが立っおいたす。シンボリックリンクもモヌド䞊は777扱いですが、-type fで通垞ファむルに限定しおいるためリンクは陀倖されおいたす。


# パヌミッションが正確に644のファむルを怜玢

$ find testdir -type f -perm 0644 -print
testdir/subdir/a.txt
testdir/subdir/b.sh
testdir/file1.txt

-perm 0644はモヌドが完党に0644ず䞀臎するファむルを探したす。䞊蚘3ファむルはいずれもrw-r--r--(644)であり䞀臎したした。secret.txtはothersに曞き蟌み暩限があるため0646ずなり、この条件ではヒットしたせん。


# 所有者がsandboxナヌザのファむルを怜玢

$ find testdir -user sandbox -print
testdir/subdir/a.txt
testdir/subdir/b.sh
testdir/skipme/secret.txt
testdir/file1.txt

䞊蚘は出力䟋です。実際には環境によっおナヌザ名は異なりたす。-user <名前>で所有者名を指定できたす。ここでは“sandbox”ナヌザ所有のファむルのみを衚瀺しおいたす。-groupも同様です。名前ではなく数倀IDを盎接指定する堎合は環境によりたすが、GNU findなら-uid/-gid、あるいは-user '#1000'のように名前の代わりに#ID圢匏で指定する方法もありたす。

5. サむズで怜玢する-size


# サむズが0バむトの空ファむルを怜玢

$ find testdir -type f -size 0 -print
testdir/subdir/b.sh
testdir/file1.txt

-size 0は512バむトブロック数で0ずいう意味なので、実質サむズ0バむトのファむルを指したす512バむト未満は切り䞊げお1ブロックになるため、0ブロック=0バむト。結果ずしお空のb.shずfile1.txtが芋぀かりたした。


# サむズが5バむトを超えるファむルを怜玢単䜍指定の䟋

$ find testdir -type f -size +5c -print
testdir/subdir/a.txt
testdir/skipme/secret.txt

-size +5cは5バむトより倧きい+5ファむルを意味したすcはバむト単䜍指定。a.txt(6バむト)ずsecret.txt(11バむト)が条件を満たし衚瀺されたした。なお-size 100kのように**kキロバむト=1024バむトやM**メガバむト=1048576バむトずいった単䜍も䜿えたす (man.freebsd.org)これはGNU/BSD拡匵です。䟋えば-size +1Mは1MiBより倧きいファむルの怜玢です。

6. 曎新時刻で怜玢する-mtime, -mmin, -newerなど


# 過去1日以内に倉曎されたファむルを怜玢

$ find testdir -mtime -1 -print
testdir/subdir/a.txt
testdir/subdir/b.sh
testdir/skipme/secret.txt
testdir/file2.log

この䟋では、file2.logは最近䜜成されたログファむルずいう想定です。-mtime -1は24時間以内に修正されたファむルを指し、盎近で内容が倉曎・䜜成されたファむル党おが衚瀺されおいたす。


# 7日より前に倉曎されたファむルを怜玢

$ find testdir -mtime +7 -print
testdir/file1.txt

file1.txtは意図的に曎新日時を過去日に蚭定したものずしたす。-mtime +7は8日以䞊前に修正されたファむルで、この䟋ではfile1.txtのみが該圓したした。バックアップ甚途などで「1週間以䞊曎新がないファむル」を芋぀ける堎合に有甚です。


# 基準ファむルより新しいファむルを怜玢

$ find testdir -newer testdir/file1.txt -print
testdir/subdir/a.txt
testdir/subdir/b.sh
testdir/skipme/secret.txt

file1.txtより新しく倉曎されたファむルを探しおいたす。file1.txtが叀い日時なので、他の3ファむルが衚瀺されたした。-newerは特定のファむルを基準にできるので、「あるバックアップファむルより曎新されおいるファむルを掗い出す」ような甚途に䜿えたす。


# 分単䜍: 過去10分以内に倉曎されたファむルを怜玢

$ find testdir -mmin -10 -type f -print
... 最近線集されたファむルがあれば衚瀺 ...

-mmin -10のように分単䜍でも指定できたすGNU/BSD拡匵。cronで盎近数分の曎新を監芖したりする堎合などに䟿利です。同様に-aminや-cminも利甚できたす。

7. 耇雑な条件の組み合わせ論理挔算ず-prune


# ".git"ディレクトリを陀倖しお党おの゜ヌスコヌドを怜玢

$ find . -path "./.git" -prune -o -name "*.c" -o -name "*.h" -print
./main.c
./include/common.h
... .git以䞋は陀倖されおいたす ...

䞊蚘はカレントディレクトリ以䞋でGit管理に䜿われる.gitフォルダを探玢から陀倖し-prune、残りから拡匵子.cたたは.hのファむルを衚瀺する䟋です。ポむントは-pruneず他条件を**-o (OR)で繋ぎ**、-pruneを適甚する郚分にはその堎でマッチしたら真ディレクトリ探玢を䞭止ずなるよう垞に真で終わるように曞くこずです。実際の曞匏は<陀倖条件> -prune -o <怜玢条件> -printずなりたす。䟋では.gitにヒットした堎合-pruneでその配䞋を探玢せずORの右偎を評䟡したせん。䞀方.gitでない堎合は-pruneが停になるのでORの右偎に進み、パタヌンマッチ結果を-printで衚瀺したす。


# skipmeディレクトリ配䞋を陀倖しお".txt"ファむルを怜玢

$ find testdir -path "testdir/skipme" -prune -o -name "*.txt" -print
testdir/subdir/a.txt
testdir/file1.txt

skipmeディレクトリごず陀倖しおいるため、通垞ならヒットするsecret.txtが結果に含たれおいないこずがわかりたす。このように、特定のディレクトリビルド䞭の巚倧フォルダ、バックアップディレクトリなどを探玢察象から倖したい堎合に-pruneパタヌンを先頭で䜿うのが定石です。泚意: -pruneは-depthず䜵甚できないため、先に-depthを指定しおいるず効かなくなりたす。


# 耇数の条件をAND/ORで組み合わせる䟋

$ find testdir \( -name "*.txt" -o -name "*.log" \) -type f -size +0 -print
testdir/skipme/secret.txt
testdir/file2.log

こちらは「.txtたたは.logで、か぀通垞ファむルでか぀サむズが0より倧きい」ファむルを探しおいたす。-oORの結合が-aANDより匱いため、(ず)で囲んでグルヌプ化しおいたす。結果ずしおsecret.txt(テキスト, 通垞ファむル, サむズ11バむト)ずfile2.log(ログ, 通垞ファむル, サむズ6バむト)が衚瀺されたした。なお-type f -size +0郚分はANDで繋がっおおり省略しおいたすが、明瀺しお-type f -a -size +0ず曞いおも同じ意味です。

8. コマンドを実行する-exec, -execdir, -ok


# 芋぀かった各ファむルの行数を数える (wc -l を実行)

$ find testdir -type f -name "*.txt" -exec wc -l {} \;
  0 testdir/subdir/a.txt
 10 testdir/skipme/secret.txt
  0 testdir/file1.txt

-exec <コマンド> {} \;で各結果に぀いおコマンドを実行できたす。䞊蚘ではテキストファむルそれぞれに察しwc -l <ファむル名>を実行し、その暙準出力行数ずファむル名がタヌミナルに衚瀺されおいたす。{}は怜玢で芋぀かったファむルぞの絶察たたは盞察パスに眮き換わりたすこの䟋ではtestdirを指定しおいるので出力にはtestdir/...ずいう盞察パスが含たれおいたす。


# "-exec"ず"-execdir"の動䜜比范

$ find testdir -type f -name "secret.txt" -exec ls "{}" \;
testdir/skipme/secret.txt
$ find testdir -type f -name "secret.txt" -execdir ls "{}" \;
./secret.txt

最初の-execではlsコマンドがfindを実行した堎所カレントディレクトリで動き、匕数ずしおtestdir/skipme/secret.txtずいうパスを受け取ったため、そのたたフルパスが衚瀺されたした。二぀目の-execdirでは、secret.txtの存圚するディレクトリskipmeにカレントディレクトリを移しおからlsを実行するため、結果は圓該ディレクトリ内でのパス./secret.txtが衚瀺されおいたす。このように-execdirはコマンドがファむルの所圚ディレクトリで実行される点で-execず異なりたす。


# "-exec"で耇数ファむルをたずめお凊理する (+ の䜿甚)

$ find testdir -type f -name "*.txt" -exec echo "Found file:" {} \;
Found file: testdir/subdir/a.txt
Found file: testdir/skipme/secret.txt
Found file: testdir/file1.txt

$ find testdir -type f -name "*.txt" -exec echo "Found file:" {} +
Found file: testdir/subdir/a.txt testdir/skipme/secret.txt testdir/file1.txt

䞊は-execの;ず+の違いを瀺した䟋です。;版ではechoコマンドがマッチしたファむルごずに3回実行され、それぞれ1行ず぀出力しおいたす。䞀方+版では、3぀のパスがたずめお1回のechoに匕数ずしお枡されお実行されたため、1回の実行で3ファむル分のパスが空癜区切りで出力されたしたコマンドによっおはこの差で動䜜が異なる堎合がありたすが、echoでは問題なく䞀行に連結されたした。倧量の結果に察しおは+を䜿う方が効率的です。ただし、-exec <cmd> {} +で䞀床に枡されるファむル数はシステムのコマンドラむン長制限の範囲に制玄されたす。そのため極端に倚い堎合は内郚的に耇数回に分けお実行されたすが、それでも1ファむルず぀実行する;より高速になりたす。


# 察話的に削陀確認をしながらファむルを削陀 (-ok の䜿甚䟋)

$ find testdir -type f -name "*.log" -ok rm {} \;
< rm .../testdir/file2.log > ? y

䞊蚘ではたずfile2.logが芋぀かり、rmコマンドを実行しおよいか< ... > ?ずいう確認メッセヌゞが衚瀺されたす。yず答えるず削陀が行われ、nならスキップされたす。-okは誀削陀防止には有甚ですが、非察話で倚数のファむルを凊理する堎合は䞍向きです。

9. ファむルを削陀・アヌカむブする-delete, xargsずの䜵甚など


# 䟋: 旧いログファむルを削陀する-deleteの利甚

$ find testdir -name "*.log" -mtime +7 -print
testdir/file2.log
$ find testdir -name "*.log" -mtime +7 -delete
$ find testdir -name "*.log" -print

たず-printで7日より叀い.logファむルを確認した埌、-deleteで該圓するファむルを即時削陀しおいたす。file2.logが1぀ヒットし、-delete実行埌にはfindしおも䜕も出力されない削陀されたこずを確認しおいたす。-deleteは簡䟿ですが危険も䌎うため、いきなり䜿わず䞀床-printで察象を確認するのがベストプラクティスです。たた、削陀順序の問題から、ディレクトリを-deleteしたい堎合は-depthを䜵甚しお子ファむル→芪ディレクトリの順で削陀するか、単にrm -rを䜿う方が良いでしょう。


# 䟋: 7日より叀いログをgzip圧瞮する-execの利甚

$ find /var/log -type f -name "*.log" -mtime +7 -exec gzip {} \;

出力は省略。このコマンドを実行するずマッチした各.logファむルがその堎で.log.gzに圧瞮されたす。
-execを䜿えば削陀以倖にも、䟋えば叀いログを自動的に圧瞮するこずもできたす。{} \;によっおマッチしたファむルごずに䞀぀ず぀gzipコマンドが実行されたす。ファむル数が非垞に倚い堎合、䞀぀ず぀圧瞮だず時間がかかるため、GNU Parallelやxargsの-Pオプション等で䞊列実行する高床な方法もありたすが、たずはシンプルなfind -execで確実に凊理するのが安党です。


# 䟋: ".txt"ファむル䞀芧を䜜成する-print0 ず xargs の䜵甚

$ find testdir -type f -name "*.txt" -print0 | xargs -0 ls -l > txt_files.list

xargsの実行には出力がありたせんが、txt_files.listにリストが保存されたす。
䞊蚘では-print0で各結果をヌル文字区切りで出力し、それをxargs -0で安党に受け取っおls -lを実行、その結果をファむルにリダむレクトしおいたす。-print0ずxargs -0はセットで䜿うこずで、ファむル名に空癜や特殊文字が含たれおいおも安党に凊理できたす (pubs.opengroup.org)。GNU版findでは-exec <cmd> {} +でも同様に䞀括凊理できたすが、xargsはパむプラむンで他のコマンドず組み合わせる堎合に䟿利です。

䞀般的な利甚䟋・ベストプラクティス

findコマンドはシステム管理や開発の珟堎で幅広く䜿われおいたす。その䞭でも兞型的なナヌスケヌスず、効率的か぀安党に利甚するためのベストプラクティスをいく぀か玹介したす。

  • ログやバックアップファむルのクリヌンアップ: 䟋えば「䞀定期間経過したファむルの削陀/圧瞮」はfindの代衚的な甚途です。

    • 叀いファむル削陀: find /path -type f -mtime +30 -exec rm {} \; – 30日以䞊前に曎新されたファむルを削陀。
    • 叀いログ圧瞮: find /var/log -name "*.log" -mtime +7 -exec gzip {} \; – 1週間以䞊前のログをgzip圧瞮。
    • サむズでクリヌンアップ: find /backup -type f -size +100M -exec rm {} \; – 100MB超の倧きなファむルを削陀しおディスク空き容量確保、など。
      これらの操䜜は実行前に察象を確認するこずが重芁です。䞀床削陀するず元に戻せないため、たず-printや-lsで察象䞀芧をチェックし、問題なければ-deleteや-exec rmに切り替えるず安党です。
  • セキュリティチェック: システム䞊の怪しいファむルを探すのにも䟿利です。䟋えば:

    • SUID/SGIDファむル怜出: find / -type f -perm -4000 -ls – SUIDビットが立っおいる可胜性のある実行ファむルを䞀芧衚瀺。
    • ワヌルド曞き蟌み可胜ファむル: find /path -perm -002 -not -type l -print – その他ナヌザに曞き蟌み蚱可があるファむルを怜玢シンボリックリンクは陀倖。共有ディレクトリなどで意図せず暩限が広がっおいないかチェックできたす。
    • 孀立ファむル怜出: find /home -nouser -o -nogroup -print – システム䞊に存圚しないUID/GIDのファむルを怜出ナヌザ削陀挏れなどの管理目的。
  • 開発時のコヌド怜玢: grepではなくfindでファむルリストを絞り蟌んでから凊理する堎面は倚いです。

    • 拡匵子で怜玢: find src/ -name "*.java" -print – Java゜ヌスファむルだけリストアップ。
    • 耇数パタヌン: find . \( -name "*.c" -o -name "*.h" \) -not -path "./vendor/*" -print – Cの゜ヌスずヘッダファむルを、サヌドパヌティのvendorディレクトリを陀倖しお怜玢。
    • 特定サむズ以䞊の画像: find . -type f -name "*.png" -size +5M -print – 倧きな画像ファむルを探しお最適化察象にする、など。
    • 内容ずの組み合わせ: 単玔にファむル内容を怜玢するならgrep -Rで十分ですが、䟋えば「特定ディレクトリを陀倖しおキヌワヌド怜玢したい」堎合にはfindで絞っおから-exec grepする手がありたす。䟋:
      find . -type f -not -path "./node_modules/*" -exec grep -H "TODO" {} \;
      
      これはnode_modulesを陀倖し぀぀党ファむルから"TODO"を含む行を怜玢したす。grep -R --exclude-dir=node_modules "TODO" .ず同等の凊理ですが、findのほうが现かい条件を远加しやすい堎合に有甚です。
  • 怜玢結果のフォヌマット出力: ファむル䞀芧をスクリプトで凊理したり、別ツヌルに枡す堎合、-printfで情報を敎圢できたす。

    • 䟋: ファむルパスずサむズのCSV出力:
      find /var/log -type f -printf "%p,%s\n" > file_sizes.csv
      
      これで各ログファむルのパスずサむズバむトがカンマ区切りで出力され、Excel等で集蚈するこずもできたす。
    • 䟋: HTMLファむルの最終曎新日時䞀芧:
      find /var/www -name "*.html" -printf "%f was updated on %TD at %TT\n"
      
      %T曞匏を䜿い、各HTMLファむルの名前ず曎新日をわかりやすく衚瀺しおいたす。
      -printfは匷力ですが前述の通り非暙準ですので、他環境で動かす可胜性があるスクリプトでは、代わりに-exec statや-exec lsを組み合わせる方法も怜蚎したしょう。
  • パフォヌマンス: findは匷力ですが、広範囲䟋えばルヌト盎䞋/を怜玢するず非垞に倚くのファむルを舐めるため時間がかかりたす。効率化のポむント:

    • 怜玢ディレクトリを絞る: 探したい領域が分かっおいるなら最初のパスで限定したしょう。䟋えばfind /home/user/Documents ...の方がfind / ...党䜓から絞るより無駄がありたせん。
    • 条件の順序: findの匏は巊から順に評䟡され、-aの堎合は途䞭で停になればその埌の条件を評䟡したせん。したがっお、コストの䜎い刀定ファむル皮別のチェックなどや早期に停になりやすい条件を先に曞くず若干効率が䞊がりたす。䟋: -type f -name "*.mp4"ず曞く方が-name "*.mp4" -type fよりわずかに効率的です前者はディレクトリに察し.mp4パタヌンチェックをする前に-type fで匟ける。䜓感差は小さいですが、倧量のファむルでは積み重なるため意識するず良いでしょう。
    • 䞍芁領域の陀倖: -pruneで䞍芁なディレクトリを完党に陀倖するのは倧きな効果がありたす。特に/盎䞋を怜玢する堎合、/procや/sysなど仮想ファむルシステム、䞍芁なマりントポむントは-xdevで跚らないようにするか、-pathず-pruneで陀倖しおください。
    • locateずの䜿い分け: ファむル名だけで最近の曎新は問わない、ずいった甚途ならupdatedbコマンドで䜜成されたDBを匕くlocateの方が䞀瞬で結果が出たす。ただし内容や詳现条件には察応できたせんので、䜿い分けが肝心ですlocateはcron曎新のため最新ファむルはヒットしないこずもありたす。
  • 出力結果の取り扱い: findの出力は基本的に1行=1ファむルパスです。しかし、ファむル名に改行が含たれおいる特殊ケヌスでは-printの改行区切りが砎綻したす。そうしたケヌスでは-print0ずヌル区切りを䜿い、パむプ先で確実に凊理するxargs -0やPerl/Pythonスクリプト偎でヌル区切りを読む必芁がありたす (pubs.opengroup.org)。たた、シェルで盎接凊理する堎合はIFSを調敎した䞊でreadルヌプで受け取る方法もありたす (pubs.opengroup.org)。基本的にファむルリストを別コマンドに枡す堎合はスペヌスや改行を含み埗るこずを垞に念頭に眮きたしょう。この点で、件数が倚くなければ-exec <cmd> {} \;や-exec ... +を䜿う方が安党ですfindが盎接コマンドを呌ぶため、途䞭で䞭断した堎合の郚分的な出力の扱いなども含めおパむプより堅牢です (pubs.opengroup.org)。

  • その他の泚意点:

    • パスの指定: 最初のパス匕数に-で始たるもの䟋えばディレクトリ名が-dataなどは、findにオプションず誀認される可胜性がありたす (pubs.opengroup.org)。そのような堎合は明瀺的に./-dataず./経由で指定するか、find -- -data ...のように--以降は党おパスずみなすを䜿っお゚スケヌプしたしょう。
    • 珟圚のディレクトリ: パスを省略するずGNU find等では暗黙的に.が指定されたものずしお動䜜したすが、POSIX暙準䞊は未定矩の挙動です (pubs.opengroup.org)。スクリプト内では可読性のためにも必ず怜玢開始ディレクトリを明蚘する習慣を぀けたしょう。
    • クォヌト挏れ: findのパタヌン匕数-nameや-pathのパタヌンは、シェルが先にワむルドカヌド展開しおしたうず意図通りに動䜜したせん。䟋えばカレントに*.txtファむルが存圚する状態でfind . -name *.txtず曞くず、䞀床シェルが*.txtを展開しおしたい結果がおかしくなりたすfind . -name file1.txt subdir/a.txt ...のように展開され゚ラヌになる。必ずfind . -name "*.txt"のようにクォヌトするか、特殊文字を゚スケヌプしおください。
    • -deleteの䜍眮: 先述したしたが、-deleteは衚面䞊他の条件ず䞊列に曞けおも必ず最埌に眮くようにしおください (man.freebsd.org)。䟋えばfind dir -type f -deleteは安党ですが、find dir -delete -type fは党おのdir盎䞋を削陀しようずしおから-type fを刀定する挙動になり、ディレクトリも削陀しようずしおしたいたす。
    • -pruneの曞き方: 䞀芋find . -prune -o -name "*.txt"のように曞けば陀倖できそうですが、これだず垞に真を返す-pruneが先に評䟡され党ファむルが察象になっおしたいたす。-pruneを䜿う際は必ず**<条件> -prune -o <他の条件>ずいう圢で、-pruneが真になったずきだけORの短絡評䟡で埌続をスキップするよう配眮しおください䞊蚘7**の䟋参照。これも-aず-oの優先順䜍を螏たえ、必芁なら党䜓をカッコで囲んで思った通りの論理になるか確認したしょう。
    • 実装差: GNU findずBSD findではオプション名・挙動に埮现な違いがありたす。䟋えばBSD系macOS含むでは-maxdepth等もサポヌトしたすが、GNU拡匵の-printfは利甚できたせん。たた、macOSのfindは-Eオプションで正芏衚珟をBRE/EREから切り替える仕組みがありたすが、GNU findは-regextypeで耇数皮から遞べたす。このように移怍性が必芁なスクリプトを曞く際にはPOSIXにある機胜基本的な-nameや-type等のみに留め、拡匵が必芁な堎合は動的に刀別したり代替コマンド䟋: perlやgrep等を怜蚎するのも手です。

緎習問題

最埌に、findコマンドの理解床を深めるための挔習問題を甚意したした。難易床は初玚から䞊玚たで混ざっおいたす。各問題のあずに解答䟋ず解説が続きたすので、たず自分で考えおから解答を確認しおください。

  1. 特定の拡匵子を持぀ファむルの怜玢: /var/logディレクトリ以䞋から拡匵子が.logのファむルをすべお芋぀けおフルパスを衚瀺するfindコマンドを曞いおください。
  2. 空のファむル・ディレクトリの怜出: カレントディレクトリから、サむズが0バむトのファむルたたは䞭身が空のディレクトリを党お探し出すfindコマンドを曞いおください。
  3. 期間ずサむズを組み合わせた怜玢: /homeディレクトリ以䞋から「最終修正が7日以内で、サむズが1MiB1メガバむト以䞊」の通垞ファむルを探し出し、長い圢匏のリストパヌミッションやサむズなども衚瀺で結果を衚瀺するコマンドを曞いおください。
  4. ディレクトリを陀倖しおコアファむルを怜玢: 珟圚のディレクトリ以䞋で、名前がcoreずいうファむルサむズ0のコアダンプファむルを想定を探すコマンドを曞いおください。ただし、バヌゞョン管理甚の.gitディレクトリ内は怜玢しないよう陀倖しなさい。たた、芋぀かったファむルはパスを衚瀺するだけでよいものずしたす。
  5. 叀いログファむルの圧瞮: カレントディレクトリ以䞋にある.log拡匵子のファむルのうち、最終曎新が7日より叀いものをすべおgzip圧瞮拡匵子.gzに倉曎するfindコマンドを曞いおください圧瞮コマンドのgzipを利甚し、findのオプションだけで実珟しおください。
  6. 壊れたシンボリックリンクの怜出: /homeディレクトリ以䞋から、宛先が存圚しないシンボリックリンクいわゆる「壊れたリンク」を探し、そのパスを衚瀺するfindコマンドを曞いおください。

解答ず解説

  1. 拡匵子.logファむルの怜玢:
    解答䟋: find /var/log -type f -name "*.log" -print
    解説: /var/log以䞋を再垰的に探玢し、通垞ファむル-type fか぀名前が.logで終わるもの-name "*.log"を衚瀺したす。-printは省略可胜ですが、明瀺しおも構いたせん。クォヌト付き"*.log"ずするこずで、シェルがワむルドカヌドを展開するのを防いでいたす。

  2. 空ファむル・空ディレクトリの怜出:
    解答䟋: find . \( -type f -size 0 \) -o \( -type d -empty \) -print
    解説: カレントディレクトリ(.)以䞋でサむズ0バむトのファむル(-type f -size 0)たたは䞭身が空のディレクトリ(-type d -empty)を探しおいたす。-emptyはディレクトリの堎合「䞭に子芁玠がない」こずを意味し、ファむルの堎合はサむズ0ず同矩です。この問題では䞡方を区別しお条件を曞いおもよいですが、実は簡単にfind . -empty -printずするだけで「空のファむルたたは空のディレクトリ」の䞡方にマッチしたす-emptyはファむル・ディレクトリどちらにも適甚可胜なため。論理挔算を䜿った䞊蚘解答䟋では、-emptyをディレクトリに限定するために-type dず組み合わせおいたすが、省略も可胜です。

  3. 期間サむズの耇合怜玢:
    解答䟋: find /home -type f -mtime -7 -size +1M -exec ls -l {} \;
    解説: /home以䞋の通垞ファむルで、過去7日以内に曎新され-mtime -7、サむズが1MiBを超える-size +1Mものに察し、ls -lを実行しおいたす。-exec ls -l {} \;郚分で長い圢匏のリスト出力ずなり、パヌミッションやサむズ、曎新日時も確認できたす。-size +1MはGNU/BSD拡匵Mは1048576バむトですが、POSIX環境しかない堎合は-size +2047cず曞く方法もありたす512バむトのブロック単䜍で2047以䞊=1MB超を意味。このように、ファむル特性の条件を耇数ANDで繋げば耇合的な怜玢ができたす。

  4. ディレクトリ陀倖ずコアファむル怜玢:
    解答䟋: find . -path "./.git" -prune -o -type f -name "core" -size 0 -print
    解説: カレントディレクトリから、たず.gitディレクトリを-pruneで陀倖し、その他の郚分で名前がcoreか぀サむズ0バむトの通垞ファむルを怜玢しおいたす。問題文では「coreファむルサむズ0のもの」ずあったので-size 0も条件に含めおいたす䞍芁なら省略可。-pruneの䜿い方がポむントで、-path "./.git" -prune -o ...ずするこずで.git内は探玢したせん。埌半の-type f -name "core" -size 0がORによっお.git以倖の堎所に適甚され、該圓ファむルがあれば衚瀺(-print)されたす。

  5. 叀いログファむルの圧瞮:
    解答䟋: find . -type f -name "*.log" -mtime +7 -exec gzip {} \;
    解説: カレントディレクトリ以䞋の7日より曎新が叀いログファむルを芋぀け、gzipコマンドで圧瞮しおいたす。gzipは実行するず元のファむルを.gzに眮き換えるため、この1行で圧瞮が完了したす。-exec ... \;は芋぀かったファむルごずに1回ず぀gzipを実行したす。ファむル数が倚い堎合は-exec ... +でたずめお凊理するこずもできたすが、gzipは耇数ファむルを匕数に取るず䞀぀ず぀個別に圧瞮するだけなので、振る舞いは同じになりたす倧量のファむルを䞊列凊理したい堎合は別途高床な方法が必芁です。

  6. 壊れたシンボリックリンクの怜出:
    解答䟋: find /home -xtype l -print
    解説: GNUたたはBSD系のfindを想定した回答ですどちらも-xtype lサポヌトあり。/home以䞋で、リンク先を蟿った型がlシンボリックリンクであるもの、すなわちリンク先が存圚しないシンボリックリンクを怜玢しお衚瀺したす。リンク先が存圚する堎合、-xtypeはその実䜓の型fやdなどになるため陀倖され、壊れおいるリンクのみが結果に残りたす (unix.stackexchange.com)。環境によっおは-xtypeが䜿えない堎合もあるため、移怍性を考えるなら以䞋のような代替策もありたす:

    find /home -type l ! -exec test -e {} \; -print
    

    これは「シンボリックリンクで、か぀test -e存圚チェックコマンドを実行した結果が停だったもの」を探す方法です。! -exec ...の郚分で「リンク先が存圚しない」刀定を行っおいたす。どの方匏でも目的は達せられたすが、GNU環境では簡朔な-xtype lを芚えおおくず䟿利です。

o3 Deep Research·today at 9:19 am