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

Jak sprawdzić wszystkie znaczniki czasowe pliku?

Czy istnieje polecenie w Linuksie do sprawdzenia wszystkich znaczników czasowych pliku?

Próbuję zobaczyć datę ostatniej modyfikacji, utworzenia i dotknięcia pliku.

Odpowiedzi (2)

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

Polecenie to nazywa się 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

Jeśli chcesz dostosować format, zajrzyj do stron man, ponieważ dane wyjściowe są specyficzne dla systemu operacyjnego i różnią się pod Linuksem/Uniksem.

Ogólnie rzecz biorąc, możesz uzyskać czasy również poprzez zwykłe listowanie katalogów:

  • ls -l wyprowadza ostatni czas modyfikacji zawartości pliku, mtime
  • ls -lc wyprowadza ostatni czas modyfikacji statusu pliku, ctime Co za różnica? )
  • ls -lu wyprowadza ostatni czas dostępu, atime (choć przydatność tej koncepcji jest przedmiotem dyskusji )

I oczywiście ctime nie rejestruje, kiedy plik został “utworzony”. Specyfikacja POSIX definiuje tylko trzy timestampy, ale niektóre systemy plików Linuksa przechowują Birth Time/Creation Time. Jak znaleźć datę utworzenia pliku? ](https://unix.stackexchange.com/q/91197/1664) Na takiej obsługiwanej konfiguracji można by użyć

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

Istnieją tylko Trzy różne wartości czasu przechowywane dla każdego z twoich plików, zgodnie z definicją POSIX Standard : http://pubs.opengroup.org/onlinepubs/9699919799/ (patrz rozdział Definicje podstawowe - 4. Pojęcia ogólne - 4.8 Aktualizacja czasów plików)

Każdy plik posiada trzy różne powiązane znaczniki czasu: czas ostatniego dostępu do danych , czas ostatniej modyfikacji danych oraz czas ostatniej zmiany statusu pliku. Wartości te są zwracane w strukturze właściwości pliku struct stat, jak opisano w <sys/stat.h> _.

I z { :

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

Poniższe przykłady pokazują różnicę pomiędzy atime , mtime i ctime , te przykłady są w GNU/Linux BASH. Możesz użyć stat -x w Mac OS X lub innym BSD Dist. aby zobaczyć podobny format wyjścia.

$ 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

Kiedy plik zostanie utworzony, trzy znaczniki czasu są takie same.


1. atime

Po pierwsze, dostęp do danych pliku przez odczytanie ich (less lub vim), wydrukowanie (cat) lub skopiowanie do innego pliku (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

Teraz zmieńmy stan pliku, poprzez zmianę uprawnień (chmod) lub zmianę jego nazwy (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!

Zauważmy, że do tej pory zawartość ( dane ) pliku jest wciąż taka sama jak w momencie jego utworzenia.


3. mtime

Na koniec zmodyfikujmy zawartość pliku poprzez jego edycję.

$ 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. czas narodzin

Zwróćmy też uwagę, że nowsza wersja stat (np. stat --version 8.13 w Ubuntu 12.04) posiada 4. informację o znaczniku czasu - Birth Time (czas utworzenia pliku). Chociaż może to nie pokazywać poprawnego czasu na razie:

$ 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: -