サブディレクトリも含めて「一番新しいファイル」のタイムスタンプを取得する
一番新しい・古いファイルのタイムスタンプを取得
Linux(RHEL系)の作業中に、「このディレクトリ配下で、一番最後に更新された(あるいは作成された)ファイルってどれだろう?」と確認したくなることはありませんが?
今回は、サブディレクトリまでまるごと再帰的に探索して、一番新しい・一番古いファイルのタイムスタンプやファイル名を取得するコマンドを目的別にまとめました。
1. タイムスタンプとファイル名だけを取得したい場合
スクリプトの変数に格納したり、純粋に最新の日時とファイル名だけをスッキリ確認したい場合は、find と sort の組み合わせが最も安全です(ファイル名にスペースが含まれていても誤動作しません)。
# 一番新しいファイルを取得 $ find . -type f -printf '%T+ %p\n' | sort -r | head -n 1 # 一番古いファイルを取得 $ find . -type f -printf '%T+ %p\n' | sort | head -n 1
-type f: ディレクトリを除外し、ファイルのみを対象にします。
-printf '%T+ %p\n': 更新日時(年-月-日+時:分:秒)とファイル名を出力します。
sort -r: 降順(新しい順)に並び替えます。昇順(古い順)で並べる場合は、「-r」のオプションは不要
head -n 1: 一番上にある最新の1行だけを抜き出します。
詳細な情報(サイズや権限)も一緒に見たい場合
使い慣れた ls -l のような詳細な形式で、一番新しいファイルを特定したい場合はこちらです。
# 一番新しいファイルを取得
$ find . -type f -exec ls -lt --time-style="+%Y-%m-%d %H:%M:%S" {} + | head -n 1
# 一番古いファイルを取得
$ find . -type f -exec ls -lt --time-style="+%Y-%m-%d %H:%M:%S" {} + | tail -n 1
ls -lt: デフォルトで「新しい順(降順)」に並び替えるオプションです。
head -n 1: 一番上(一番新しい)の1行を表示します。
tail -n 1: 一番下(最も古い)の1行を表示します。
「作成日時(Birth time)」が一番新しいファイルを特定したい場合
ファイルの「更新」ではなく、システムに「新規作成」されたのが一番新しいファイルをサブディレクトリ含めて探す場合は、RHEL8(XFS/ext4)の特性を活かして stat を使います。
# 一番新しいファイルを取得 $ find . -type f -print0 | xargs -0 stat -c "%W %x %n" | sort -rn | head -n 1 # 一番古いファイルを取得 $ find . -type f -print0 | xargs -0 stat -c "%W %x %n" | sort -n | head -n 1
stat -c "%W": ファイルの作成日時を「UNIXタイム(エポック秒)」という数値で出力し、それを sort -rn で大きい順(新しい順)に並び替えています。古い順の時はsortコマンドの「-r」の省いています

