A maneira mais barata de encontrar o arquivo mais antigo (recursivamente) de um diretório sob carga pesada

1

Qual é a maneira menos onerosa de encontrar o arquivo mais antigo em um diretório, incluindo todos os diretórios abaixo. Suponha que o diretório seja suportado pela SAN e sob carga pesada.

Existe a preocupação de que "ls" possa estar bloqueando e causar degradação do sistema sob carga pesada.

Editar: Encontrar funciona muito bem em um caso de teste simples - encontrar o arquivo mais antigo entre 400 GB de arquivos em uma unidade SSD levou 1/20 segundos. Mas este é um laptop MacBook Pro sem carga ... Então, é um pouco de maçã para laranjas caso de teste.

E como um aparte, qual é a melhor maneira de descobrir implementações (algoritmos subjacentes) para tais comandos?

    
por Robert Christian 17.07.2013 / 23:49

2 respostas

2

com zsh :

oldest=(**/*(.DOm[1]))

Para o arquivo regular mais antigo ( zsh de resolução de tempo é para o segundo)

Com ferramentas GNU:

(export LC_ALL=C
 find . -type f -printf '%T@\t%p
oldest=(**/*(.DOm[1]))
' | sort -zg | tr '
(export LC_ALL=C
 find . -type f -printf '%T@\t%p%pre%' |
   sort -zg | tr '%pre%\n' '\n%pre%' | head -n 1 |
   cut -f2- | tr '%pre%' '\n')
\n' '\n%pre%' | head -n 1 | cut -f2- | tr '%pre%' '\n')
    
por 18.07.2013 / 00:02
0

Para minimizar o número de processos externos, você poderá otimizar executando um script personalizado em vez de um find adequado. O diretório transversal e stat() de cada arquivo não podem ser otimizados, mas você só precisa manter o arquivo mais antigo até agora na memória.

Aqui está uma tentativa em 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

Em meus testes, em um diretório moderadamente grande (129019 nós), isso é aproximadamente 50% mais lento do que a versão @StephaneChazelas "GNU Tools", mas você pode achar que funciona melhor em alguns cenários, especialmente para diretórios muito grandes .

    
por 18.07.2013 / 09:13