É possível obter a hora em que o arquivo foi aberto da última vez e classificar todos os arquivos em um diretório nesses horários?
Isso depende exatamente do que você quer dizer com "aberto", mas, em geral, sim. Existem três carimbos de hora normalmente registrados:
mtime
- atualizado quando o conteúdo do arquivo é alterado. Este é o horário do arquivo "padrão" na maioria dos casos.ctime
- atualizado quando o arquivo ou seus metadados (proprietário, permissões) são alteradosatime
- atualizado quando o arquivo é lidoEntão, geralmente, o que você quer ver é o atime
de um arquivo. Você pode conseguir isso com stat
ou com ls
. Você pode ls -lu
fazer isso, embora eu prefira usar ls -l --time=atime
(que deve ser suportado em quase todas as distribuições modernas do Linux) porque não o uso com frequência e, quando o faço, me lembro melhor. E para classificar por hora, adicione a -t
bandeira a ls. Então lá vai você.
Há uma grande ressalva, no entanto. Atualizar o atime toda vez que um arquivo é lido causa muitas E / S desnecessárias, tornando tudo mais lento. Portanto, a maioria das distribuições Linux agora padroniza a noatime
opção de montagem do sistema de arquivos, que basicamente mata as vezes, ou então relatime
, que somente atualiza as vezes quando o limite ultrapassa (normalmente uma vez por dia) ou se o arquivo foi realmente modificado desde a leitura anterior. Você pode descobrir se essas opções estão ativas executando o mount
comando
Além disso, observe que os tempos de acesso são por inode, não por nome de arquivo, portanto, se você tiver hardlinks, a leitura de um atualizará todos os nomes que se referem ao mesmo arquivo.
E lembre-se de que c não é "criação"; a criação não é rastreada pelos sistemas de arquivos Unix / Linux, o que parece estranho, mas faz sentido porque o sistema de arquivos não tem como saber se é o original - talvez o arquivo tenha sido criado há quarenta anos e copiado aqui. E, de fato, muitos editores de arquivos trabalham fazendo cópias sobre o original. Se você precisar dessas informações, é melhor usar um sistema de controle de versão como git
.
mount
manual atualizada .ls
reduz o tempo por padrão para uma precisão sensata. Para ver a hora com precisão total, pode-se usar--full-time
.ls -ltu
liste todos os arquivos, mostrando e classificando por hora de acesso.De
man ls
:fonte
O
find
comando é melhor para isso. Veja as-ctime
,-mtime
e-atime
opçõesfonte
Se sua listagem for para consumo humano, use
ls
com um dos sinalizadores de classificação de data (-tu
para hora de acesso (leitura), apenas-t
para hora de modificação (gravação) ou-tc
para hora de alteração do inodo). Veja a resposta de mattdm para obter mais informações (em particular a ressalva-a
e a definição de-c
).Se for para consumo do programa, analisar a saída de
ls
é problemático . Se o seu shell for zsh, você não precisa dels
qualquer maneira: o zsh possui qualificadores de globbing para classificar as correspondências aumentando o tempo de acesso (*(Oa)
), mudança de inode (*(Oc)
) ou modificação (*(Om)
). Uma minúsculao
classifica aumentando a idade.Caso contrário, se você souber que os nomes dos arquivos não contêm caracteres de nova linha ou não imprimíveis (no código do idioma atual), poderá fazer algo como
Se você deseja chamar um comando em muitos arquivos de uma só vez, precisará de mais configurações. Observe que
act_on_files_by_date $(ls -t)
não funciona assim, pois os nomes de arquivos contendo caracteres curinga ou espaço em branco seriam expandidos no resultado da substituição do comando. O código a seguir funciona desde que nenhum nome de arquivo contenha uma nova linha ou um caractere não imprimível:Se você quiser lidar com nomes de arquivos arbitrários, terá muita dificuldade sem recorrer a ferramentas mais poderosas do que um shell padrão: zsh, perl, python…
fonte