「昨夜のメンテナンス後にどのファイルが書き換わったか」「先週から今週にかけて設定が改ざんされていないか」――こうした問いに対し、findコマンドの-mtimeオプションは最短経路を提供します。ファイルシステムの更新タイムスタンプ(mtime)を条件にして、目的の期間に変更されたファイルだけを絞り込めます。
まず結論:よく使う3パターンのコマンド
検索対象のパスを適宜変えて、そのまま使えます。
# 直近24時間以内に変更されたファイルを検索
find /etc -mtime -1 -type f
# ちょうど1〜2日前(24〜48時間前)に変更されたファイルを検索
find /var/log -mtime 1 -type f
# 2日以上前に変更されたファイルを検索
find /home -mtime +1 -type f
数値の前に付く記号(-・なし・+)が検索の方向を決定します。次のセクションでしくみを整理します。
-mtimeの数値指定の読み方
-mtimeの引数 N は「24時間を1単位」として扱います。現在時刻からN×24時間を基準に、3通りの方向で絞り込みます。
-mtime -N # 現在からN×24時間より新しい(直近N日以内)
-mtime N # N×24時間前〜(N+1)×24時間前の範囲
-mtime +N # (N+1)×24時間より古い
たとえば現在時刻が15:00のとき、-mtime -1は「昨日の15:00以降」、-mtime 1は「一昨日15:00〜昨日15:00の間」、-mtime +1は「一昨日15:00より前」を意味します。日付の境界(0時)ではなく、現在時刻から24時間単位で計算される点に注意してください。
タイムゾーンはシステム設定に依存します。UTC設定のサーバーではtimedatectlで確認し、日本時間(JST)との9時間のずれを頭に入れておくと混乱を防げます。
シナリオ別:実務で使うコマンドパターン
障害調査:直近に変更されたファイルを洗い出す
「深夜に何かが変わってサービスが止まった」という場面では、/etc配下を直近1日で絞り込むのが定石です。-lsオプションを付けるとパーミッションとタイムスタンプも合わせて表示されるため、ls -lを別途叩く手間が省けます。
find /etc -mtime -1 -type f -ls
-type fを付けることでディレクトリ自体のタイムスタンプを除外し、実際に内容が変わったファイルだけに絞れます。出力が多い場合は| sort -k8,9でタイムスタンプ順に並べ替えると変更の流れが把握しやすくなります。
バッチ出力の確認:特定日に生成されたファイルを探す
「昨日のバッチが出力したファイルだけ確認したい」という場合は記号なしのmtime 1を使います。ただし24時間の境界問題があるため、バッチ実行時刻によっては前後にファイルがひっかかることがあります。厳密に日時を指定したい場合は後述の-newerが確実です。
find /var/log/batch -mtime 1 -type f
ディスク整理:古い一時ファイルを探す
30日以上更新されていないファイルをリストアップして削除候補を把握します。-deleteは取り消しが効かない破壊的操作のため、必ず確認のみのコマンドを先に実行してリストを目視してから削除に進んでください。
# まず確認(削除はしない)
find /tmp -mtime +30 -type f
# 内容を確認したうえで削除する場合
find /tmp -mtime +30 -type f -delete
分単位で絞り込む:-mminオプション
「直近30分以内に変わったファイル」など、より細かい時間指定には-mmin(分単位)を使います。本番トラブル対応のリアルタイム調査やデプロイ直後の影響確認には、-mtime -1よりも-mminのほうが余計なファイルを拾わずに済みます。
# 直近30分以内に変更されたファイル
find /var/log -mmin -30 -type f
# 60〜90分前に変更されたファイル
find /var/log -mmin 60 -type f
# 120分より前に変更されたファイル
find /var/log -mmin +120 -type f
特定ファイルを基準にして比較する:-newerオプション
「このファイルが変わった後に更新されたものを探したい」という場面では-newerが便利です。日数の境界問題を気にせず、基準ファイルのmtime以降という絶対的な比較ができます。
# /etc/nginx/nginx.conf が更新された以降に変更されたファイルを探す
find /etc/nginx -newer /etc/nginx/nginx.conf -type f
# デプロイスクリプトが更新したマーカーファイルを基準にする例
find /opt/app -newer /opt/app/DEPLOY_TIMESTAMP -type f
ある運用現場では、デプロイ時にtouch /opt/app/DEPLOY_TIMESTAMPでマーカーファイルを作成しておき、次回デプロイ時に-newerで差分ファイルを洗い出すフローを組み込んでいます。変更追跡の仕組みをシンプルに自動化できます。
検索結果をさらに活用する組み合わせテクニック
単に一覧を出すだけでなく、後続処理に渡すことで調査効率が上がります。
# 直近1日に変更されたファイルの中から「error」を含む行を検索
find /var/log -mtime -1 -type f | xargs grep -l "error"
# 変更されたファイルを詳細表示でリスト(ls -lと同等)
find /etc -mtime -1 -type f -exec ls -lh {} \;
# 変更されたファイルのパスと更新時刻だけを整形表示
find /etc -mtime -1 -type f -printf "%T+ %p\n" | sort
-printf "%T+ %p\n"はGNU findの拡張書式で、更新日時を YYYY-MM-DD+HH:MM:SS 形式で表示します。macOSのBSD findでは使えないため、Linux専用の手法として覚えておいてください。
注意点:mtime・ctime・atimeの違いと落とし穴
Linuxのファイルには3種類のタイムスタンプがあります。statコマンドで確認できます。
stat /etc/hosts
出力に含まれる Access(atime)・Modify(mtime)・Change(ctime) の3種類のうち、-mtimeが追うのはファイルの内容が最後に変更された時刻(mtime)だけです。パーミッションやオーナーの変更ではmtimeは更新されず、ctimeが変わります。設定ファイルの書き換えと権限変更を区別したいときは-ctimeも合わせて確認してください。
また、多くの現代的なLinuxサーバーはI/O削減のためnoatimeマウントオプションを採用しています。この環境では-atimeでの検索は正確に機能しません。/etc/fstabやmount | grep noatimeでマウントオプションを確認してから使うか、-mtimeまたは-ctimeを使うのが無難です。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
