Maneira eficiente de obter arquivos modificados / criados pela última vez

1

Eu tenho uma pasta com muitos arquivos (vários registros gerados por um site).

Gerenciado para contá-los com:

$ find . -maxdepth 1|wc -l
803313

Agora preciso verificar os registros nos últimos dias. Obtendo os últimos 100/1000 / ... arquivos é tão bom. O problema é que o comando acima demorou cerca de 5 segundos. Então, com quase 1 milhão de arquivos, meu ls -lrt|tail -n 100 normal não é uma opção.

Então, alguma idéia sobre como obter com eficiência os últimos arquivos modificados?

PS: Usando o Ubuntu 12.04 LTS

    
por Vlad Preda 25.09.2014 / 13:54

2 respostas

4

A própria descoberta pode filtrar arquivos dentro de um intervalo de tempo. Você disse que queria arquivos mais novos do que alguns dias atrás:

find . -maxdepth 1 -ctime -3

Isto irá encontrar todos os arquivos alterados nos últimos 3 dias.

Você pode usar -ctime (alterações de status do arquivo), -mtime (alterações de dados do arquivo) e -atime (alterações acessadas pelo arquivo).

Se você precisar de mais granularidade, use -cmin, -mmin e -amin (que usam minutos em vez de dias).

O intervalo de tempo pode ser um número simples ou usar sinais +/-, da seguinte maneira:

  Numeric arguments can be specified as

   +n     for greater than n,

   -n     for less than n,

   n      for exactly n.

então -mtime -3 dará a você arquivos modificados 3 dias (e menos) atrás. -mtime 3 dará a você arquivos modificados 3 dias atrás (observe que partes fracionárias são descartadas, então isso fornecerá arquivos modificados entre 3 e 4 dias atrás). -mtime +3 dará todos os arquivos modificados 3 (e mais) dias atrás.

    
por roadmr 25.09.2014 / 15:45
4

Você pode usar printf para imprimir a data, %T@ dá a você a hora da modificação como um timestamp unix:

find . -type f -printf "%T@ %p\n" | sort -rn | head -n 10

Em uma pasta com 250.000 arquivos, leva 10 segundos.

Sidenote : Para encontrar o arquivo mais recente muito rapidamente, você pode usar

find . -type f -printf "%T@
find . -type f -printf "%T@ %p\n" | sort -rn | head -n 10
%p
find . -type f -printf "%T@%pre%%p%pre%" | gawk ' { if ($0>max) { max=$0; getline mostrecent } else getline } END{print mostrecent}' RS='%pre%'
" | gawk ' { if ($0>max) { max=$0; getline mostrecent } else getline } END{print mostrecent}' RS='%pre%'

Isso leva menos de 2 segundos em 250.000 arquivos.

    
por Jan 25.09.2014 / 14:49

Tags