2012-02-07 14:59:56 +0000 2012-02-07 14:59:56 +0000
54
54

Como verificar todos os carimbos temporais de um ficheiro?

Existe um comando no Linux para verificar todos os carimbos temporais de um ficheiro?

Estou a tentar ver as últimas datas modificadas, criadas, e tocadas no ficheiro.

Respostas (2)

75
75
75
2012-02-07 15:03:39 +0000

O comando é chamado stat .

$ stat test
234881026 41570368 -rw-r--r-- 1 werner staff 0 0 "Feb 7 16:03:06 2012" "Feb 7 16:03:06 2012" "Feb 7 16:03:06 2012" "Feb 7 16:03:06 2012" 4096 0 0 test

Se quiser ajustar o formato, consulte as páginas man, uma vez que a saída é específica para OS e varia sob Linux/Unix.

Geralmente, também se pode obter os tempos através de uma listagem de directórios normal:

  • ls -l sai da última vez que o conteúdo do ficheiro foi modificado, o mtime
  • ls -lc sai da última vez que o estado do ficheiro foi modificado, o ctime Qual é a diferença? )
  • ls -lu sai da última vez que o conteúdo do ficheiro foi modificado, o atime (embora a utilidade deste conceito seja sujeito a discussão )

& E, claro, ctime não regista quando um ficheiro foi “criado”. A especificação POSIX define apenas três carimbos temporais, mas alguns sistemas de ficheiros Linux armazenam a Hora de Nascimento/Hora de Criação. Como encontrar a data de criação do ficheiro? Em tal configuração suportada, pode-se usar

stat --printf '%n\nmtime: %y\nctime: %z\natime: %x\ncrtime:%w\n'
21
21
21
2014-03-15 09:24:38 +0000

Existem apenas THREE valores de tempos distintos armazenados para cada um dos seus ficheiros, como definido pelo POSIX Standard : http://pubs.opengroup.org/onlinepubs/9699919799/ (ver a secção Base Definitions -> 4. General Concepts -> 4.8 File Times Update)

Cada ficheiro tem três carimbos temporais distintos associados: a hora do último acesso aos dados , a hora da última modificação de dados , e a hora da última modificação do estado do ficheiro*. Estes valores são devolvidos na estrutura de características do ficheiro, tal como descrito em \sys/stat.h> _.

E de \sys/stat.h> :

atime is for Last data access timestamp.
mtime is for Last data modification timestamp.
ctime is for Last file status change timestamp.

Os exemplos seguintes mostram a diferença entre os atime , mtime e ctime , estes exemplos estão em GNU/Linux BASH. Pode usar stat -x em Mac OS X ou outro BSD Dist. para ver o formato de saída semelhante.

$ stat --version
stat (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ touch test
$ stat test
  File: `test'
  Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 811h/2065d Inode: 98828525 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 514/ rank) Gid: ( 514/ rank)
Access: 2014-03-16 10:58:28.609223953 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

Quando o ficheiro acaba de ser criado, três carimbos temporais são os mesmos.


1. atime

Primeiro, vamos acessar os dados do ficheiro lendo-o (less ou vim), imprimindo-o (cat) ou copiando-o para outro ficheiro (cp).

$ cat test #Nothing will be printed out, since the file is empty
$ stat test
  File: `test'
  Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 811h/2065d Inode: 98828525 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 514/ rank) Gid: ( 514/ rank)
Access: 2014-03-16 10:59:13.182301069 +0800 <-- atime Changed!
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

2. ctime

Agora vamos alterar o estado do ficheiro, alterando a permissão (chmod) ou renomeando-o (mv)

$ chmod u+x test
$ stat stet
  File: `test'
  Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 811h/2065d Inode: 98828525 Links: 1
Access: (0764/-rwxrw-r--) Uid: ( 514/ rank) Gid: ( 514/ rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:04:10.178285430 +0800 <-- ctime Changed!
$    
$ mv test testing
$ stat testing
  File: `testing'
  Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 811h/2065d Inode: 98828525 Links: 1
Access: (0764/-rwxrw-r--) Uid: ( 514/ rank) Gid: ( 514/ rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:06:33.342207679 +0800 <-- ctime Changed again!

Note-se que até agora, o conteúdo ( dados* ) do ficheiro continua a ser o mesmo de quando foi criado.


3. mtime

Finalmente, vamos modificar o conteúdo do ficheiro editando o ficheiro.

$ echo 'Modify the DATA of the file' > testing
$ echo 'Modify the DATA of the file also change the file status' > testing
$ stat testing
  File: `testing'
  Size: 56 Blocks: 8 IO Block: 4096 regular file
Device: 811h/2065d Inode: 98828525 Links: 1
Access: (0764/-rwxrw-r--) Uid: ( 514/ rank) Gid: ( 514/ rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 11:09:48.247345148 +0800 <-- mtime Changed!
Change: 2014-03-16 11:09:48.247345148 +0800 <-- ctime also Changed!

4. hora de nascimento

4. hora de criação do ficheiro

& Também notar que a versão mais recente de stat (por exemplo stat --version 8.13 em Ubuntu 12.04) tem a 4ª informação de carimbo da hora - a hora de nascimento (hora de criação do ficheiro). Embora possa não mostrar a hora correcta, por agora:

$ stat --version
stat (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ stat birth_time
  File: `birth_time'
  Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 805h/2053d Inode: 4073946 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ bingyao) Gid: ( 1000/ bingyao)
Access: 2014-03-16 10:46:48.838718970 +0800
Modify: 2014-03-16 10:46:48.838718970 +0800
Change: 2014-03-16 10:46:48.838718970 +0800
 Birth: -