Linux の find コマンド: ファイルとディレクトリを検索する方法
Linux の find コマンドは、指定されたディレクトリとそのサブアイテムを検索して、名前、タイプ、サイズなどの条件に一致するファイルまたはディレクトリを見つけます。検索場所と条件を一緒に指定し、ファイル名パターンは引用符で囲んで、シェルが事前に展開しないようにします。
基本フォーマットと検索範囲
以下の形式では、開始パスは検索が始まる場所であり、条件は検索対象を制限します。パス自体も検索対象に含まれます。以下の例はGNU findutils findとBashに基づいています。
find PATH EXPRESSION
find .は現在のディレクトリおよびサブディレクトリを探索し、find /etcは/etcから開始します。条件が指定されていない場合、パスを表示し、隠しファイルや隠しディレクトリも探索します。権限のないディレクトリはアクセスエラーが表示される場合があり、その内容は検索されません。
次の演習では、新しい一時ディレクトリにファイルを作成します。workdir変数を保持するために、同じターミナルで続行する必要があります。場所を確認するためにパスを表示した後、例を実行します。
workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"
名前とファイルタイプで検索
-nameはフルパスではなく、最終パスコンポーネントに対して大文字小文字を区別して一致します。-inameは大文字小文字を区別しません。シングルクォートは、シェルが*を先に展開するのを防ぎ、パターンをそのままfindに渡すために必要です。
find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'
最初のコマンドはapp.confと.hidden.confを検索し、2番目のコマンドはEXTRA.CONFも見つけます。出力の順序は環境によって異なる場合があります。find /etc *.confを入力すると名前条件がなく、シェルの展開によって意図しない動作をする可能性があるため、避けてください。代わりにfind /etc -name '*.conf'を使用します。
-type fは通常のファイルを検索し、-type dはディレクトリを検索します。条件が組み合わさる場合は、すべて満たされる必要があります。
find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'
最初のコマンドは、拡張子が一致する通常のファイルのみを出力し、2つ目のコマンドはdocsという名前のディレクトリのみを出力します。デフォルトでは、GNU findはサブディレクトリ内のシンボリックリンクをたどりません。リンク自体を検索するには、-type lを使用します。
深さと空の項目による範囲の絞り込み
-maxdepth 1は、開始パスとその直下の項目までのみを検索します。結果から開始パスを除外するには、-mindepth 1も指定してください。GNU findでは、両方のオプションを条件より前に置くことが推奨されます。
find "$workdir" -mindepth 1 -maxdepth 1 -type d
実際には、docsおよびempty-dirが直下に表示されます。-emptyは空の通常ファイルや空のディレクトリを見つけるため、必要なタイプを指定することで区別できます。
find "$workdir" -type f -empty
find "$workdir" -type d -empty
練習でtouchにより作成されたファイルはすべて空です。2番目のコマンドではempty-dirが表示されます。検索結果を直接削除対象として扱わず、まずパスと条件を確認してください。
見つかったファイルに対してコマンドを実行する
-execは一致する項目に対してコマンドを実行します。次の例では、削除せずに通常ファイルのバイト数を出力します。{}は見つかったパスに置き換えられ、+は可能な限り複数のパスをまとめてコマンドに渡します。
find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +
練習用ファイルが空であるため、各ファイルのバイト数は0として表示されます。複数のファイルを受信した場合、wcは合計も表示できます。ファイル名にスペースが含まれていても、各パスは別々の引数として渡されます。各項目に対してコマンドを個別に実行するには、+の代わりに\;を使用できます。
削除または変更コマンドを組み合わせる前に、まず同じ条件下でパスのみを出力し、対象とバックアップを確認してください。他のユーザーが検索中にファイルを変更する可能性があるディレクトリでは、確認後であっても対象が変わることがあるため、特に注意が必要です。詳細については、GNU find セキュリティ上の考慮事項を参照してください。
結果が期待と異なる場合
結果が得られない場合は、まず開始パス、名前の大文字小文字、拡張子、ファイルタイプの順に確認してください。また、パターンが引用符で囲まれているかどうか、-nameの代わりにフルパスが必要かどうかも確認してください。フルパスに基づいて検索する場合は、-pathを使用できます。
アクセス権エラーが発生した場合、検索できない領域があることを意味します。必要なアクセス権を確認し、管理者権限を使用する場合は、検索範囲と実行する操作を慎重に制限してください。名前パターンやオプションの詳細な意味については、GNU findの名前パターンの説明を参照してください。




