これは機能します (Daniel Andersson の提案を組み込むために更新されました):
find -type f -printf '%T+ %p\n' | sort | head -n 1
これは、GNU find
に依存しないため、移植性が少し高くなります。 拡張子 -printf
であるため、BSD / OS X でも動作します:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
ここでの唯一の欠点は、ARG_MAX
のサイズに多少制限されていることです。 (すべき ほとんどの新しいカーネルには関係ありません)。したがって、getconf ARG_MAX
以上ある場合 文字が返された場合 (私のシステムでは 262,144 文字)、正しい結果が得られません。 -print0
であるため、POSIX にも準拠していません。 および xargs -0
そうではありません。
この問題のその他の解決策については、次の記事で概説しています:ディレクトリ内の最新 (最新、最古、最古) のファイルを見つけるにはどうすればよいですか? – グレッグのウィキ
次のコマンド コマンドは、あらゆる種類の奇妙なファイル名で動作することが保証されています:
find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat
find -type f -printf "%[email protected] %T+ %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'
stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"
null バイトの使用 (\0
) 改行文字の代わりに (\n
) は、ファイル名の 1 つに改行文字が含まれている場合でも、find の出力が理解できることを確認します。
-z
このスイッチは、sort と grep の両方が null バイトのみを行末文字として解釈するようにします。 head にはそのようなスイッチがないため、grep -m 1
を使用します。 代わりに (1 回のみ)。
コマンドは実行時間 (私のマシンで測定) で並べられています。
-
最初のコマンドは、最初にすべてのファイルの mtime を人間が読める形式に変換してから、それらの文字列を並べ替える必要があるため、最も遅くなります。 cat へのパイプにより、出力の色付けが回避されます。
-
2 番目のコマンドはわずかに高速です。日付変換を実行しながら、数値による並べ替え (
sort -n
) Unix エポックからの経過秒数が少し速くなります。 sed は、Unix エポックからの秒数を削除します。 -
最後のコマンドは変換をまったく行わず、最初の 2 つのコマンドよりも大幅に高速になるはずです。 find コマンド自体は最も古いファイルの mtime を表示しないため、stat が必要です。
関連する man ページ:find – grep – sed – sort – stat