Respostas:
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
:
-u with -lt: sort by, and show, access time with -l: show access
time and sort by name otherwise: sort by access time
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 de ls
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úscula o
classifica aumentando a idade.
act_on_files_by_date *(Om)
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
ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}
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:
IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS
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…