A razão pela qual não existe uma 'ferramenta padrão' é porque a lógica é - como você encontrou - bastante simples. O fator limitante é que você deve fazer uma travessia profunda de diretórios, e isso é sempre um processo dispendioso.
Não importa qual abordagem você adota em termos de ferramentas de script - o 'custo' é o IO do disco.
Assim, as otimizações que eu sugeriria seriam:
- Não ande todo o FS. Bail fora de sua travessia quando você encontrou o suficiente. (
find | shuf
efind | head
não fazem isso). - Você provavelmente pode aproximar o tamanho do diretório referindo-se aos últimos percursos e "avançar" por alguma margem. Os arquivos de estatísticas
- são processados e a gravação de
mtime
ajudará você a criar as duas listas. Se você gerar um número aleatório, selecione o último arquivo e o último arquivo recente antes desse número.
Algo parecido com isto (em perl
, mas tenho certeza que você poderia fazer isso em Python)
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
my $random_file;
my $recent_random_file;
my $limit = rand ( 7_000_000 ); #ideally set to file count on fs.
sub search {
if ( $count++ > $limit ) {
$File::Find::prune = 1; #stop traversing
return;
}
return unless -f;
if ( -M $File::Find::name < 1 ) { $recent_random_file = $File::Find::name };
$random_file = $File::Find::name;
}
find ( \&search, "/path/to/search");
print "$recent_random_file $random_file\n";