ディレクトリ(以下のすべてのディレクトリを含む)で最も古いファイルを見つける最も安い方法は何ですか?ディレクトリがSANによってサポートされ、負荷が高いと仮定します。
過負荷状態で「ls」がロックされ、システムの性能が低下する恐れがあります。
編集:Findは簡単なテストケースで非常によく行われました。 SSDドライブの400GBファイルの中で最も古いファイルを見つけるのに1/20秒かかりました。しかし、これは無負荷状態のMacBook Proなので、少しのリンゴとオレンジのテストケースです。
しかし、そのようなコマンドの実装(基本アルゴリズム)を見つけるための最良の方法は何ですか?
答え1
そしてzsh
:
oldest=(**/*(.DOm[1]))
最も古い一般ファイルの場合(zsh
時間解像度は秒)
GNUツールの使用:
(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' |
sort -zg | tr '\0\n' '\n\0' | head -n 1 |
cut -f2- | tr '\0' '\n')
答え2
外部プロセスの数を最小限に抑えるために適切なfind
。stat()
Perlでの試みは次のとおりです。
find2perl -eval 'BEGIN { our ($filename, $oldest); }
my @s=stat(_); if (! defined $::oldest || $s[9] < $::oldest) {
$::oldest=$s[9]; $::filename = $File::Find::name }
END { print "$::filename\n" }' | perl
私のテストでは、非常に大きなディレクトリ(129019ノード)では、実際には@StephaneChazelasの「GNUツール」バージョンより約50%遅いですが、場合によっては特に非常に大きなディレクトリではうまく機能することがわかります。