O método mais fácil é usar o zsh, graças aos seus qualificadores de glob .
print -lr -- $dir/**/$str*(om[1,10])
Se você tiver o GNU find, faça-o imprimir os tempos de modificação do arquivo e classifique por isso.
find -type f -printf '%T@ %pfind -type f -printf '%T@ %p\n' |
sort -k 1nr |
sed 's/^[^ ]* //' | head -n 10
' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr 'find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
@sorted = sort {$_{$a} <=> $_{$b}} keys %_; # sort by increasing age
print @sorted[0..9];
}'
' '\n' | head -n 10
Se você tiver o GNU, mas não outros utilitários GNU, use novas linhas como separadores ao invés de nulos; você perderá o suporte para nomes de arquivos contendo novas linhas.
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in (sorted(times.iterkeys(), key=lambda f:times[f], reverse=True))[:10]: print f'
Se você tem Perl (aqui eu assumirei que não há novas linhas nos nomes dos arquivos):
print -lr -- $dir/**/$str*(om[1,10])
Se você tem Python (também assumindo que não há novas linhas em nomes de arquivos):
find -type f -printf '%T@ %pfind -type f -printf '%T@ %p\n' |
sort -k 1nr |
sed 's/^[^ ]* //' | head -n 10
' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr 'find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
@sorted = sort {$_{$a} <=> $_{$b}} keys %_; # sort by increasing age
print @sorted[0..9];
}'
' '\n' | head -n 10
Provavelmente existe uma maneira de fazer o mesmo no PHP, mas eu não sei.
Se você quiser trabalhar apenas com ferramentas POSIX, é um pouco mais complicado; veja Como listar arquivos ordenados por data de modificação recursivamente (nenhum comando stat disponível!) (retrair os 10 primeiros é a parte fácil).