obter a idade do arquivo especificado

12

Como posso obter a idade de um determinado arquivo em, pelo menos, dias?

Estou ciente ls -lhe comandos semelhantes. Eu quero algo que funcione mais ou menos assim:

getfage <FILE> # prints out '12d' (12 days)

Além disso, isso precisa ser um pouco multiplataforma, já que eu também gostaria de usá-lo no Mac OS X, mas o principal caso de uso está na minha caixa do Linux.

NOTA

Como o Linux não controla o tempo de criação, estou procurando uma solução dupla: uma para mtime (linux) - que é a última vez que o arquivo foi modificado - e outra para o Mac OS X, que pode lidar com mtime ou hora de criação.

Alexej Magura
fonte
@ slm Isso é especificamente sobre o tempo de criação, ele não entra na era da computação na linha de comando.
Gilles 'SO- stop be evil'
@terdon, na verdade não. Veja minha NOTA acima.
Alexej Magura
@AlexejMagura e como as respostas no dupe não fazem por você? statdá tudo o que você precisa, certo?
terdon

Respostas:

16

O Unix não controla uma data de criação. As únicas informações disponíveis são normalmente as últimas vezes que os arquivos foram:

  1. Acessado
  2. Modificado
  3. Alterado
  • Acesso - a última vez que o arquivo foi lido
  • Modificar - a última vez que o arquivo foi modificado (o conteúdo foi modificado)
  • Alterar - a última vez que os metadados do arquivo foram alterados (por exemplo, permissões)

( A partir desta resposta )

Você pode obter datas relacionadas a um arquivo específico usando o statcomando

Exemplo

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX e HFS

Se você estiver usando o OSX, o sistema de arquivos usado no Unix é o HFS . Este é um dos poucos (que eu conheço) que mantém a data de criação no sistema de arquivos, juntamente com o tempo de modificação, etc., semelhante a outros Unixes.

excerto

Um registro de arquivo armazena uma variedade de metadados sobre o arquivo, incluindo seu CNID, o tamanho do arquivo, três registros de data e hora (quando o arquivo foi criado, modificado pela última vez, último backup), o primeiro arquivo se estende dos garfos e ponteiros de dados e recursos aos primeiros registros de extensão de dados e recursos do arquivo no Arquivo de estouro de extensão. O Registro de arquivo também armazena dois campos de 16 bytes que são usados ​​pelo Finder para armazenar atributos sobre o arquivo, incluindo código do criador, código do tipo, a janela em que o arquivo deve aparecer e sua localização na janela.

Timestamps

Os carimbos de data e hora são sempre mantidos no sistema de arquivos, portanto, você fica limitado por qualquer rastreamento de tempo oferecido por eles (EXT3, EXT4, XFS, etc.).

Sistemas de arquivos

Se você estiver curioso, dê uma olhada neste tópico da Wikipedia intitulado: Comparação de sistemas de arquivos . Ele possui a lista mais extensa de itens de arquivo que eu conheço, além de uma boa tabela de vários recursos e o status de suporte ou não em um determinado sistema de arquivos.

Referências

slm
fonte
Obrigado pela atualização, isso ajuda. Na verdade, li aqui que o ext4 pode manter as datas de criação, mas isso ainda não foi implementado no kernel.
terdon
@terdon - sim, faz sentido que alguns sistemas de arquivos o suportem. Parece muito atrasado para mim, eu entendo no passado por que foi deixado de fora, mas tudo avançou tanto desde o início que não faz sentido explicitamente não ter isso. Além disso, você pode desativar o suporte ao tempo de acesso para que ele possa ser implementado de maneira semelhante e, em seguida, desativado se você realmente não o desejar.
slm
18

O OSX mantém o controle da criação de arquivos, mas a maioria dos outros departamentos não, por isso não há como saber o tempo decorrido desde a criação do arquivo. Você pode obter o tempo decorrido desde a última modificação em praticamente qualquer sistema operacional.

Não existe um utilitário de shell portátil para recuperar o tempo de modificação de um arquivo, exceto o lsque possui uma saída quase impossível de analisar. No Linux, o seguinte comando imprime a idade de um arquivo:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

No Linux, você pode usar stat -c %Y -- "$filename"como sinônimo de date +%s -r "$filename".

OSX datee statcomandos são diferentes. Você pode usar o seguinte comando:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Sistemas Linux não integrados e OSX têm o Perl instalado por padrão.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles 'SO- parar de ser mau'
fonte
Isso depende do sistema operacional ou do sistema de arquivos? Essas perguntas e respostas parecem implicar que o sistema de arquivos os mantém, mas o kernel precisa fornecer um método para acessá-los.
terdon
@terdon - veja minhas atualizações.
slm
@terdon Ambos. Que as perguntas e respostas que você vincula estão corretas, os sistemas de arquivos atuais acompanham o tempo de criação há algum tempo. No FreeBSD, você pode obter isso de fato stat, no Linux o syscall não foi retrabalhado e, portanto, você deve recorrer a hackers debugfs.
wingedsubmariner
1
@wingedsubmariner Com a ressalva de que o horário de criação no sistema de arquivos geralmente não é a data de criação no aplicativo, já que muitos aplicativos usam create-new-then-move como o método para salvar uma nova versão em vez de substituir no local.
Gilles 'SO- stop be evil'
4

Com base na resposta de Gilles, aqui está uma função bash que retorna a idade do arquivo em segundos ou erro.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
fonte
1
Função puro, fácil de se adaptar, adicionando divisão simples de ver a idade em horas, dias, semanas ....
Emmanuel Devaux
0

Você pode usar stat -f%B,, ls -lUou mdls -n kMDItemFSCreationDatepara ver a hora da criação (nascimento) no OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10
Lri
fonte
0
stat -c %Y <filename>

procure man statpor -copções (formato)

Guido Rizzi
fonte