Edição: Eu acho que este post não é 'particularmente útil' como eu pensava que era. Esta é uma solução realmente rápida que apenas rastreia o arquivo modificado mais recentemente (em vez de classificar a lista inteira de arquivos):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
Espalhe por várias linhas para maior clareza:
find . -type f -printf '%T@ %p\n' | awk '
BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
{
if ($1 > mostrecenttime)
{ mostrecenttime = $1; mostrecentline = $0; }
}
END { print mostrecentline; }' | cut -f2- -d ' '
Fim da edição
Não é um post particularmente útil, mas como 'organizar' estava discutindo velocidade, pensei em compartilhar isso.
As soluções de arranjo e enzotib envolvem a listagem de todos os arquivos dentro do diretório com seus respectivos tempos e classificação. Como você sabe, a classificação não é necessária para encontrar o máximo. Encontrar o máximo pode ser feito em tempo linear, mas a classificação leva n log (n) tempo [eu sei que a diferença não é muito, mas ainda assim;)]. Não consigo pensar em uma maneira elegante de implementar isso. [EDIT: Uma implementação limpa (embora com aparência desagradável) e rápida fornecida acima.]
Próxima melhor coisa - Para encontrar o arquivo editado mais recentemente em um diretório, localize recursivamente o arquivo editado mais recentemente em cada subdiretório de nível 1. Deixe este arquivo representar o subdiretório. Agora classifique os arquivos de nível 1, juntamente com os representantes dos subdiretórios de nível 1. Se o número de arquivos de nível 1 e subdiretórios de cada diretório for quase constante, esse processo deverá ser dimensionado linearmente com o número total de arquivos.
Isto é o que eu vim para implementar isso:
findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .
Corri isso e recebi um monte de find: findrecent: No such file or directory
erros. Razão: -exec de find é executado em um shell diferente. Eu tentei definir findrecent em .bashrc, .xsessionrc, mas estes não ajudaram [eu apreciaria a ajuda aqui]. No final, eu recorri a colocar
#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
em um script chamado findrecent
no meu PATH e depois executá-lo.
Eu executei isso, continuei esperando e sem saída. Só para ter certeza de que não estava lidando com nenhum loop infinito, modifiquei o arquivo para
#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
e tentei novamente. Funcionou - mas demorou 1 minuto e 35 segundos na minha pasta - as soluções do arranjo e do enzotib levaram 1,69, 1,95 segundos, respectivamente!
Tanto pela superioridade de O (n) sobre O (n log (n))! Droga, você trabalha com a chamada em cima! [Ou melhor, sobrecarga de chamada de script]
Mas esse script é melhor que as soluções anteriores e aposto que ele será executado mais rapidamente do que eles no banco de memória do Google; D