メインコンテンツへスキップ
中級8分で読める

findコマンドで効率的にファイル検索

Linuxのfindコマンドを使って、複雑な条件でファイルやディレクトリを検索する方法を実例を交えて詳しく解説します。

実践編findファイル検索ファイル操作中級者向け

🎯 この記事で学べること

  • 1
    findコマンドの基本的な使い方と構文をマスターできます
  • 2
    ファイル名、サイズ、更新日時など様々な条件で検索できるようになります
  • 3
    複数の条件を組み合わせた高度な検索ができるようになります
  • 4
    検索結果に対してコマンドを実行する-execの使い方を習得できます
  • 5
    大量のファイルを効率的に管理・整理するテクニックが身につきます

読了時間: 約8

はじめに

こんにちは!今日は「find」という、とっても強力なファイル検索コマンドを学びましょう。

「どこに保存したか忘れたファイルを探したい...」「大きいファイルを全部見つけたい...」「古いファイルを整理したい...」そんな経験はありませんか?

findコマンドは、まるで優秀な探偵犬のように、指定した条件に合うファイルをシステム全体から探し出してくれます。名前だけでなく、サイズ、更新日時、権限など、いろいろな手がかりで検索できるんですよ!

findの基本的な使い方

基本構文

まずは基本の形を覚えましょう!

find [検索開始ディレクトリ] [オプション] [検索条件] [アクション]

簡単に言うと:「どこから」「どんな条件で」「何を探すか」を指定する感じです!

名前で検索(一番基本!)

最初はファイル名で検索する方法から始めましょう:

$ find . -name "file.txt"  # 現在のディレクトリ以下でfile.txtを探す
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

見てください!.jsファイルだけがピンポイントで見つかりましたね。

-nameは大文字小文字を区別します。『File.txt』も『file.txt』も両方見つけたい時は-inameを使いましょう!

🎮 理解度チェック

find . -name '*.txt' というコマンドは何をしますか?

便利な検索条件を覚えよう!

ファイルタイプで検索(ファイル?フォルダ?)

-typeオプションを使うと、ファイルだけ、ディレクトリだけなど、種類を指定できます:

# ファイルのみ検索(f = file)
$ find . -type f

# ディレクトリのみ検索(d = directory) 
$ find . -type d

# シンボリックリンクのみ検索(l = link)
$ find . -type l
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

覚え方:file、directory、linkの頭文字です!

サイズで検索(大きいファイルを探そう!)

「容量を圧迫している大きいファイルを探したい!」そんな時は-sizeオプションです:

# 1MB以上のファイル(+は「以上」)
$ find . -size +1M

# 100KB未満のファイル(-は「未満」)  
$ find . -size -100k

# ちょうど1024バイトのファイル(符号なしは「ちょうど」)
$ find . -size 1024c

サイズの単位(覚えやすい!):

  • c: バイト(character)
  • k: キロバイト
  • M: メガバイト(大文字のM!)
  • G: ギガバイト(大文字のG!)

+は「より大きい」、-は「より小さい」、何もつけないと「ちょうど」という意味になります。符号の意味を覚えるだけでOKです!

更新日時で検索(古いファイルを整理!)

「最近作ったファイルはどれ?」「古いファイルを整理したい」そんな時は更新日時で検索しましょう:

# 7日以内に更新されたファイル(最近のファイル)
$ find . -mtime -7

# 30日以上前に更新されたファイル(古いファイル)
$ find . -mtime +30

# ちょうど1日前に更新されたファイル
$ find . -mtime 1
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

-mtime -7は「7日以内」、-mtime +7は「7日より前」を意味します。サイズ検索と同じで、+-の意味を覚えれば大丈夫です!

時刻関連のオプション(いろいろあります!):

  • -mtime: 変更時刻(日単位)- 一番よく使う!
  • -atime: アクセス時刻(日単位)
  • -ctime: 状態変更時刻(日単位)
  • -mmin: 変更時刻(分単位)- もっと細かく!

🎮 理解度チェック

find . -mtime -7 というコマンドは何を検索しますか?

権限で検索(上級者向け!)

-permオプションで特定の権限を持つファイルを検索できます:

# 実行権限を持つファイル
$ find . -perm /111

# 権限が644のファイル
$ find . -perm 644

# 少なくとも所有者に書き込み権限があるファイル
$ find . -perm -u+w

権限検索はセキュリティチェックやスクリプトの管理に便利ですが、最初は名前やサイズ検索からマスターしましょう!

複数条件の組み合わせ(もっと賢く検索!)

AND条件(「かつ」の検索)

複数の条件を並べると、自動的にAND条件(両方満たす)になります:

# .jsファイルかつ1KB以上(両方の条件を満たす)
$ find . -name "*.js" -size +1k

つまり、「.jsファイルで、かつ、1KB以上」という意味になります。

OR条件(「または」の検索)

「あれか、これ」を探したい時は-oオプションです:

# .jsまたは.pyファイル(どちらか一方)
$ find . -name "*.js" -o -name "*.py"
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

OR条件を使う時は、\( \)で囲むと確実です。グループ化して正しく動作させるためです!

NOT条件(「以外」の検索)

「これ以外」を探したい時は!を使います:

# .txtファイル以外
$ find . ! -name "*.txt"

「!」は「ではない」という意味。便利ですね!

🎮 理解度チェック

find . -name '*.js' -o -name '*.py' の意味は?

検索結果に対するアクション(見つけた後の処理!)

-exec:コマンドの実行(魔法のような機能!)

見つけたファイルに対して、自動的にコマンドを実行できます:

# 30日以上前の.logファイルを削除
$ find . -name "*.log" -mtime +30 -exec rm {} \;

# 検索したファイルの詳細情報を表示  
$ find . -name "*.txt" -exec ls -l {} \;
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

-execの最後の\;は必須です!忘れやすいので注意しましょう。{}は見つかったファイル名に置き換わります。

-delete:ファイルの削除(慎重に!)

見つかったファイルを直接削除できます:

# 空のディレクトリを削除
$ find . -type d -empty -delete

# .tmpファイルを削除
$ find . -name "*.tmp" -delete

-deleteは強力ですが危険でもあります!まず-deleteなしで実行して、何が削除されるか確認してから使いましょう!

-print0とxargsの組み合わせ(上級テクニック)

スペースを含むファイル名も安全に処理できます:

# スペースを含むファイル名も正しく処理
$ find . -name "*.txt" -print0 | xargs -0 grep "keyword"

実践的な使用例(現場で使えるテクニック!)

大きなファイルの検索と削除(容量不足を解消!)

# 100MB以上のファイルを検索して確認
$ find /home -size +100M -type f -exec ls -lh {} \;

# 確認後、削除(慎重に!)
$ find /home -size +100M -type f -delete

ディスク容量が足りない時の救世主です!

古いバックアップファイルの整理(自動メンテナンス)

# 30日以上前のバックアップファイルを検索
$ find /backup -name "*.bak" -mtime +30 -ls

# アーカイブ化してから削除(賢い!)
$ find /backup -name "*.bak" -mtime +30 -exec tar -czf old_backups.tar.gz {} + -delete

古いファイルを単純に削除するのではなく、アーカイブしてから削除すれば、後で必要になった時に復元できます。これがプロの技です!

特定のディレクトリを除外(node_modulesとか邪魔!)

# node_modulesを除外して.jsファイルを検索
$ find . -path ./node_modules -prune -o -name "*.js" -print

# 複数のディレクトリを除外
$ find . \( -path ./node_modules -o -path ./vendor \) -prune -o -name "*.php" -print
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

node_modulesのような巨大なディレクトリを除外すると、検索が格段に速くなります!

重複ファイルの検索

# 同じサイズのファイルを検索
$ find . -type f -printf '%s %p\n' | sort -n | uniq -d -w 10

セキュリティチェック

# SUIDビットが設定されたファイルを検索
$ find / -perm -4000 -type f 2>/dev/null

# world-writableなファイルを検索
$ find . -perm -002 -type f

パフォーマンスの最適化

検索範囲を限定

# 深さを制限(2階層まで)
$ find . -maxdepth 2 -name "*.conf"

# 特定の深さのみ検索
$ find . -mindepth 2 -maxdepth 2 -type d

早期終了

# 最初の一致で終了
$ find . -name "config.json" -print -quit

よくあるエラーと対処法

Permission denied

# エラーを表示しない
$ find / -name "file.txt" 2>/dev/null

# エラーをログファイルに記録
$ find / -name "file.txt" 2>errors.log

Argument list too long

# xargsを使用して回避
$ find . -name "*.log" -print0 | xargs -0 rm

# -execの+オプションを使用
$ find . -name "*.log" -exec rm {} +

高度な使用例

正規表現での検索

# 数字で始まるファイル名
$ find . -regex '.*/[0-9].*'

# 拡張正規表現を使用
$ find . -regextype posix-extended -regex '.*\.(jpg|png|gif)$'

カスタム出力フォーマット

# ファイル名、サイズ、更新日時を表示
$ find . -type f -printf "%p\t%s\t%TY-%Tm-%Td\n"

📝 まとめ

今日はfindコマンドについて学びました!

  • findは超強力なファイル検索コマンド(まるで優秀な探偵犬!)
  • 基本の検索:-name(名前)、-type(種類)、-size(サイズ)、-mtime(更新日時)
  • 条件の組み合わせ:AND(並べるだけ)、OR(-o)、NOT(!
  • 見つけた後の処理:-exec(コマンド実行)、-delete(削除)
  • 実践的な使い方:大きいファイル探し、古いファイル整理、特定ディレクトリの除外

findコマンドは最初は複雑に見えるかもしれませんが、基本的な使い方から始めて、少しずつ高度な機能を覚えていけば大丈夫です。特にfind . -name "*.txt"のような基本検索をマスターすれば、日々の作業が格段に楽になりますよ!

慣れてきたら-execを使った自動処理にも挑戦してみてください。大量のファイルを効率的に管理できるようになります!

今日の練習: まずfind . -name "*.txt"でテキストファイルを探してみましょう。次にfind . -type dでディレクトリだけを表示。慣れてきたらfind . -name "*.log" -mtime +7で古いログファイルを探してみてください!