última vez que o arquivo foi aberto

82

É possível obter a hora em que o arquivo foi aberto pela última vez e classificar todos os arquivos em um diretório por esses horários?

    
por student 08.03.2011 / 15:56

4 respostas

148

Isso depende exatamente do que você quer dizer com "aberto", mas, em geral, sim. Existem três timestamps normalmente gravados:

  • mtime - atualizado quando o conteúdo do arquivo é alterado. Este é o tempo de arquivo "padrão" na maioria dos casos.
  • ctime - atualizado quando o arquivo ou seus metadados (proprietário, permissões) são alterados
  • atime - atualizado quando o arquivo é lido

Assim, geralmente, o que você deseja ver é o atime de um arquivo. Você pode obter isso com stat ou com ls . Você pode usar ls -lu para fazer isso, embora eu prefira usar ls -l --time=atime (que deve ser suportado em quase todas as distribuições Linux modernas), porque eu não o uso com frequência e, quando o faço, posso me lembrar dele melhor. E para classificar por hora, adicione o -t flag a ls. Então lá vai você.

Há uma grande advertência, no entanto. A atualização do atime toda vez que um arquivo é lido causa muito IO desnecessário em geral, reduzindo a velocidade de tudo. Portanto, a maioria das distribuições Linux agora é a opção noatime filesystem mount, que basicamente mata atimes, ou então relatime , que só atualiza atimes depois que um limite passou (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 comando mount .

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 deles atualizará todos os nomes que se referem ao mesmo arquivo.

E, esteja ciente de que c não é "criação"; a criação não é rastreada por sistemas de arquivos Unix / Linux, o que parece estranho, mas na verdade 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 do original. Se você precisar dessas informações, é melhor usar um sistema de controle de versão como git .

    
por 08.03.2011 / 16:15
17

ls -ltu lista todos os arquivos, mostrando e classificando por tempo 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
    
por 08.03.2011 / 16:02
4

O comando find é melhor para isso. Veja as opções -ctime , -mtime e -atime

    
por 09.09.2012 / 21:04
3

Se a sua listagem for para consumo humano, use ls com um dos sinalizadores de classificação de data ( -tu para tempo de acesso (leitura), apenas -t para modificação (gravação) ou -tc para alteração de inode Tempo). Veja a resposta de mattdm para mais informações (em particular a advertência referente a -a e a definição de -c ).

Se isso é para o consumo do programa, analisar a saída de ls é problemático . Se o seu shell é zsh, você não precisa do ls de qualquer forma: zsh possui qualificadores de globbing para ordenar as correspondências aumentando o acesso ( *(Oa) ), a mudança de inode ( *(Oc) ) ou o tempo de modificação ( *(Om) ). Um o minúsculo 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 caracteres não imprimíveis (na localidade atual), você pode 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ê quiser invocar um comando em muitos arquivos de uma só vez, precisará de mais configurações. Note que act_on_files_by_date $(ls -t) não funciona assim, já que 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 precisar de ferramentas mais poderosas do que um shell padrão: zsh, perl, python…

    
por 08.03.2011 / 20:19

Tags