obter a idade do arquivo fornecido

11

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

Estou bem ciente de ls -lh e 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 de plataforma cruzada, 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.

OBSERVAÇÃO

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

    
por Alexej Magura 27.11.2013 / 00:23

5 respostas

15

O Unix não acompanha a data de criação. A única informação disponível é normalmente a última vez que os arquivos foram:

  1. Acessado
  2. Modificado
  3. alterado

Você pode obter datas relacionadas a um determinado arquivo usando o comando stat .

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 sob esse Unix é HFS . Este é um dos poucos (que eu estou ciente) que mantém a data de criação dentro do sistema de arquivos, juntamente com o tempo de modificação, etc. semelhante a outros Unixes.

trecho

A File Record stores a variety of metadata about the file including its CNID, the size of the file, three timestamps (when the file was created, last modified, last backed up), the first file extents of the data and resource forks and pointers to the file's first data and resource extent records in the Extent Overflow File. The File Record also stores two 16 byte fields that are used by the Finder to store attributes about the file including things like its creator code, type code, the window the file should appear in and its location within the window.

Timestamps

Os timestamps são sempre mantidos no sistema de arquivos, então você fica limitado pelo tempo que o rastreamento é oferecido através deles (EXT3, EXT4, XFS, etc.).

Sistemas de arquivos

Se você estiver curioso, dê uma olhada neste tópico da Wikipédia intitulado: Comparação de sistemas de arquivos . Ele tem a lista mais extensa de arquivos que eu conheço, juntamente com uma boa tabela dos vários recursos e o status de ser suportado ou não dentro de um determinado sistema de arquivos.

Referências

por 27.11.2013 / 00:31
12

O OSX monitora a criação de arquivos, mas a maioria dos outros não, portanto não há como saber o tempo decorrido desde a criação do arquivo. Você pode obter o tempo decorrido desde sua última modificação em praticamente qualquer sistema operacional.

Não há nenhum utilitário de shell portátil para recuperar o tempo de modificação de um arquivo, exceto ls , que tem saída quase impossível de analisar. No Linux, o comando a seguir 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" .

Os comandos date e stat do OSX são diferentes. Você pode usar o seguinte comando:

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

Os sistemas Linux não embarcados e o OSX têm o Perl instalado por padrão.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
    
por 27.11.2013 / 01:12
3

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
}
    
por 23.09.2014 / 20:45
0

Você pode usar stat -f%B , ls -lU ou mdls -n kMDItemFSCreationDate para ver o tempo de 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
    
por 20.06.2014 / 08:41
-2
stat -c %Y <filename>

veja as opções man stat para -c (format)

    
por 27.05.2018 / 16:05