julho 29, 2019

Três formas de checar a última modificação de um arquivo

Pesquisando para a minha série de vídeos e artigos sobre a criação de um monitor/indicador de atualizações para o Xfce e o i3wm, eu me deparei com a necessidade de checar a data e a hora da última modificação do arquivo /var/cache/apt/pkgcache.bin, que é alterado sempre que nós executamos um apt update ou um apt-get update. As pesquisas continuam, mas eu queria aproveitar para compartilhar aqui as três forma que eu conheço para fazer isso.

Comando 'ls'

A primeira forma de conseguir essa informação, talvez o primeiro impulso de todos nós, seria através do comando ls. Na opção de exibição em lista, ls -l, as colunas 6, 7 e 8 mostra, respectivamente, o mês, o dia e a hora da última modificação dos arquivos e pastas. para extrair apenas esses três valores, bastaria processar a saída com o awk:

ls -l /caminho/arquivo | awk '{ print $6" "$7" "$8 }'

Testando com o meu arquivo de cachê do apt...

:~$ ls -l /var/cache/apt/pkgcache.bin | awk '{print $6" "$7" "$8}'
jul 29 22:32
:~$

Comando 'stat'

O comando stat pode não ser tão famoso quanto o ls, mas é uma boa ferramenta para fornecer informações diversas sobre o status de um arquivo. A saída padrão do comando seria algo assim:

:~$ stat /var/cache/apt/pkgcache.bin
    Arquivo: /var/cache/apt/pkgcache.bin
    Tamanho: 33969680   Blocos: 66352      bloco de E/S: 4096   arquivo comum
Dispositivo: 802h/2050d Inode: 2883800     Links: 1
     Acesso: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
     Acesso: 2019-07-29 22:32:14.809337579 -0300
Modificação: 2019-07-29 22:32:14.841337632 -0300
  Alteração: 2019-07-29 22:32:14.841337632 -0300
    Criação: -
:~$ 

Mas, sem recorrer a nenhuma filtragem por outros comandos, nós podemos fazer com ele exiba apenas o que nós queremos. Segundo o manual (man stat)...

-c  --format=FORMAT
              use the specified FORMAT instead of the default; output  a  new‐
              line after each use of FORMAT
      ...
      The valid format sequences for files (without --file-system):
      ...
      %y     time of last data modification, human-readable
      ...

Ou seja, executando o stat com o parâmetro -c %y, nós teremos apenas a data da última modificação do arquivo formatada de forma humanamente legível, assim:

:~$ stat -c '%y' /var/cache/apt/pkgcache.bin
2019-07-29 22:32:14.841337632 -0300

Comando 'date'

Pouca gente sabe que o comando date pode ser usado para outras coisas além de exibir e formatar a data e a hora do sistema, e uma dessas coisas é a data e a hora da última modificação de um arquivo. Segundo o manual, existe o argumento...

-r, --reference=FILE
              display the last modification time of FILE

Portanto, esta seria a saída do comando date -r /caminho/arquivo:

:~$ date -r /var/cache/apt/pkgcache.bin
seg jul 29 22:32:14 -03 2019

Mas, a grande vantagem do comando date é que ele ainda permite a formatação desta saída, como pode ser visto abaixo:

:~$ date -r /var/cache/apt/pkgcache.bin +'%b %d,%Y %R'
jul 29,2019 22:32
:~$

Tempos de execução

Se o parâmetro fosse apenas a simplicidade, eu escolheria sempre o comando date. Mas, vamos testar o tempo de execução de cada uma dessas três alternativas:

:~$ time ls -l /var/cache/apt/pkgcache.bin | awk '{print $6" "$7" "$8}'
jul 29 22:32

real    0m0,009s
user    0m0,001s
sys     0m0,014s

...

:~$ time stat -c "%y" /var/cache/apt/pkgcache.bin
2019-07-29 22:32:14.841337632 -0300

real    0m0,004s
user    0m0,004s
sys     0m0,000s

...

:~$ time date -r /var/cache/apt/pkgcache.bin +'%b %d,%Y %R'
jul 29,2019 22:32

real    0m0,003s
user    0m0,003s
sys     0m0,000s

Bom, parece que, além de mais prático, o comando date também é o método mais rápido.

Dúvidas? Correções? Outras ideias?

Sirva-se dos comentários!

Nenhum comentário:

Postar um comentário

O sistema de comentários do Blogspot é um lixo e praticamente me obriga a liberar ou moderar todos os comentários. Portanto, eu peço perdão antecipadamente caso o seu comentário demore para aparecer.

Mas não se acanhe por causa disso! :-)